2009-04-23 17 views
2

scanfで文字列に空白を入力する方法がありますか? 改行を除いて入力するのにこの[^ \ n]を使用していますが、問題はたくさんありますそれは入力buffer.whatを取得し、関数fgetsは多くの問題を作成している.both入力文字列への最善の方法がある中で、保存されているように見えるとして、これは無限ループを作成している入力文字列scanf

 while(strcmp(buf,"quit")) 
       {  
      scanf("%*[^\n]",buf); 
      n=send(connected,buf,strlen(buf),0); 
      if(n<0) 
      { 
      perror("send"); 
      printf("error sending"); 
      exit(1); 
      } 
      //printf("server has send\n"); 
      n=recv(connected,buf,100,0); 
      if(n<0) 
      { 
      perror("recv"); 
      printf("error recieving"); 
      exit(1); 
      } 
      //printf("waiting to recieve something\n"); 
      buf[n]='\0'; 
      printf("client:%s\n",buf); 
     } 

同じことを何度も何度も繰り返され、 。あなたが持つ悩みを持っているすべてが空行である場合は、入力のラインを読むこと

答えて

0

で、strcmp("\n", buffer) == 0を使用しています。

投稿した正規表現は、Cが"%*[^\n]"'\n'文字をリテラル改行に変換するため、うまく動作しません。それがうまく機能するようにするには、スラッシュを描く必要があります。"%*[^\\n]"

しかし、読書にも問題があるようですが、私はそれをより良い機能を使用することをお勧めします。

ファイルから任意のサイズの連続した行を読み込むために、前に次のコードを使用しました。しかしノートの

カップル、:

  1. 返されるバッファは、あなたがそれ
  2. で行われた後のコードは、すべての反復をバイトのカップルを浪費しますが、これがない限り、本当に目立たないfree() Dにする必要がありますBUFFER_SIZEは、線の長さと比較して非常に小さい。

コードでは、FILE *から1行が読み込まれ、 '\ n'で終わることが保証されています。

/* 
* Initial size of the read buffer 
*/ 
#define DEFAULT_BUFFER 1024 

/* 
* Standard boolean type definition 
*/ 
typedef enum{ false = 0, true = 1 }bool; 

/* 
* Flags errors in pointer returning functions 
*/ 
bool has_err = false; 

/* 
* Reads the next line of text from file and returns it. 
* The line must be free()d afterwards. 
* 
* This function will segfault on binary data. 
*/ 
char *readLine(FILE *file){ 
    char *buffer = NULL; 
    char *tmp_buf = NULL; 
    bool line_read = false; 
    int iteration = 0; 
    int offset = 0; 

    if(file == NULL){ 
     fprintf(stderr, "readLine: NULL file pointer passed!\n"); 
     has_err = true; 

     return NULL; 
    } 

    while(!line_read){ 
     if((tmp_buf = malloc(DEFAULT_BUFFER)) == NULL){ 
      fprintf(stderr, "readLine: Unable to allocate temporary buffer!\n"); 
      if(buffer != NULL) 
       free(buffer); 
      has_err = true; 

      return NULL; 
     } 

     if(fgets(tmp_buf, DEFAULT_BUFFER, file) == NULL){ 
      free(tmp_buf); 

      break; 
     } 

     if(tmp_buf[strlen(tmp_buf) - 1] == '\n') /* we have an end of line */ 
      line_read = true; 

     offset = DEFAULT_BUFFER * (iteration + 1); 

     if((buffer = realloc(buffer, offset)) == NULL){ 
      fprintf(stderr, "readLine: Unable to reallocate buffer!\n"); 
      free(tmp_buf); 
      has_err = true; 

      return NULL; 
     } 

     offset = DEFAULT_BUFFER * iteration - iteration; 

     if(memcpy(buffer + offset, tmp_buf, DEFAULT_BUFFER) == NULL){ 
      fprintf(stderr, "readLine: Cannot copy to buffer\n"); 
      free(tmp_buf); 
      if(buffer != NULL) 
       free(buffer); 
      has_err = true; 

      return NULL; 
     } 

     free(tmp_buf); 
     iteration++; 
    } 

    return buffer; 
} 
+0

オフセット= DEFAULT_BUFFER *反復 - 反復; は、この行は、単純に次のようになります。オフセット= DEFAULT_BUFFER *反復 – mawia

+0

Cがリテラルの改行に「%※[^ \ n]は」における「\ n」の文字を変換します。それがうまく機能するようにするには、スラッシュを強調表示する必要があります: "%* [^ \\ n]"。 あなたはあなた.how%※[^ \\ n]は%※[^ \\ n]はより良く動作するの上記の行を説明できますか? – mawia

+0

あなたは、コードがすべてのiteration.iは、このようなwatageがどこにあるか、あなたが指摘wastage.canそのようなを参照してくださいいけないバイトの一定量を無駄にすることを言及しましたか? – mawia

1

はるかに良い方法は

char line[128]; /* Or whatever. */ 

while(fgets(stdin, line, sizeof line) != NULL) 
{ 
    /* Filter out whitespace before checking tokens. */ 
} 
+0

ええ最初の入力後 を待っていると、永遠に待っていた私はfgetsのをしようとしていたが、それはいくつかの微妙なproblem.theプログラムを作成していたが理由とどのようにそれを克服するために何ができるか提案することができますか? ありがとう! – mawia

+0

うん、関数fgets()は、それが継続する前に入力のフルラインを待ちます、同期しています。あなたが入力を読み取ることを妨げない方法を望んでいることは明らかでした。それは別の質問です。 :) – unwind

0

それをサポートしている場合にも、scanf("%*[^\n]",buf);には二つの問題がありgetline()を使用することができます。

  1. 指定子にアスタリスクが値がスキャンされますが、保存されませんが。
  2. 次の改行文字までスキャンしますが、その文字は消費しません。つまり、最初のコール以降のすべてのコールは何も読み取られません。
+0

2行目の 'that'は 'それらの文字列'に置き換えてください。そうではありませんか? bcz%* [^ \ n]は、消費されないすべてのキャラクターをスキップします。 「何も読まないだろう最初のものは後にすべての呼び出し」を説明buffer.PLZ入力の新しい行のストレージのそれbczを.is も、あなたは何を意味しています。 – mawia

0

私は、あなたが探しているのscanfがあると思う:

のscanf( "%の[^ \ n]は%※C"、BUF)。

%[^ \ n]はあなたの文字列を取得し、%* cは改行を無視します。

しかし、これは

ノンブロッキング入力は完全に何か他のものであるあなたは、「Cの文字列を読み取ることがない方法」Googleの場合は何を得る文字通りです。あなたはGoogleの "cbreakモード"かもしれません。しかし、それはunix-y terminal-yの問題です.Windows上であれば、おそらく意味をなさないでしょう。 X/Gtk/Qtはそのようなことをする他の方法を持っています。