2016-10-02 8 views
1

私のコマンド・インタープリタの入力を読み込んでいる間に私のロジックを正当化しようとしています。私が遭遇している問題はstrstr()です"%s"として受け入れていないか、haystackを文字列として扱い、そのためにスペースや改行などを無視しています。Cバッファ内の複数のスペースで区切られた入力を調べる

char command[4] = ""; 
char arg1[512] = ""; 
char arg2[512] = ""; 
char tmp[1029] = ""; 
char buffer[BUFFERSIZE]; 
memset(buffer, '\0', BUFFERSIZE); 

while(fgets(buffer, BUFFERSIZE, stdin) != NULL){ 
    strcpy(command, ""); 
    strcpy(arg1, ""); 
    strcpy(arg2, ""); 
    strcpy(tmp, ""); 
    if(strstr(buffer, "%s\n") != NULL) 
     sscanf(buffer, "%s", command); // 0 arguments 
    if(strstr(buffer, "%s %s") != NULL) 
     sscanf(buffer, "%s", arg1);  // 1 argument 
    if(strstr(buffer, "%s %s %s") != NULL) 
     sscanf(buffer, "%s", arg2);  // 2 arguments 
    printf("%s %s %s\n", command, arg1, arg2); 
} 

何でI入力:

  • コム
  • ヴァルargument1val
  • cmdはarg1がarg2val
  • など

私はいつものために空の文字列で終わりますcommand,arg1、およびarg2

私の入力は、常に1つの文字列または最大3つのスペースで区切られた文字列とそれに続く改行文字です。

答えて

1

#include <stdio.h> 
#include <strings.h> 

#define BUFFERSIZE 2000 

int main() 
{ 
int nb_args; 
char command[4] = ""; 
char arg1[512] = ""; 
char arg2[512] = ""; 
char buffer[BUFFERSIZE]; 
memset(buffer, '\0', BUFFERSIZE); 

while(fgets(buffer, BUFFERSIZE, stdin) != NULL){ 
    strcpy(command, ""); 
    strcpy(arg1, ""); 
    strcpy(arg2, ""); 

    nb_args = sscanf(buffer, "%3s%511s%511s", command,arg1,arg2); 
    if (strlen(command)==0) 
    { 
     printf("empty line\n"); 
    } 
    else 
    { 
    switch(nb_args) 
    { 
     case 1: 
      printf("Command = %s\n",command); 
      break; 
     case 2: 
      printf("Command = %s, arg1 = %s\n",command,arg1); 
      break; 
     case 3: 
      printf("Command = %s, arg1 = %s, arg2 = %s\n",command,arg1,arg2); 
      break; 
    } 
    } 
} 
} 
+0

これは私が考えようとしていたロジックとまったく同じでした!ご協力いただきありがとうございます! –

0

strstrファンクションは、printf形式の書式文字列を使用しません。第1引数の中の第2引数の正確な内容を探します。

代わりに使用するものはstrtokで、区切り文字(この場合はスペース)に基づいて文字列を分割します。あなたは一度だけスキャンしsccanf戻ります(空行のための特別なチェックでは、入力された)ことを、解析された引数の数をチェックする必要があり

char *p; 
p = strtok(buffer, " "); 
if (p) { 
    strcpy(command, p); 
    p = strtok(NULL, " "); 
    if (p) { 
     strcpy(arg1, p); 
     p = strtok(NULL, " "); 
     if (p) { 
      strcpy(arg2, p); 
     } 
    } 
} 
0

あなたは非常に迅速に適切な答えが必要になります。 任意の空白を含む文字列を取り、先頭と末尾の空白を削除して空白文字を取り除き、すべての空白文字を1つの空白で置き換えます。次に、単一のスペースがデリミタであることを知っている単語のリストを作成します。

他の方法もありますが、この関数を記述すると、文字列がメモリ内にどのようにレイアウトされているか、およびそれらを操作する方法がわかります。

関連する問題