2

私のプログラムは、新しい構造を作成して配列に格納できるはずですが、格納および表示するためのコマンドは困難を伴います。

  • 配列に新しい変数構造体を作成するには、ユーザーは「set varname varcontents
  • 変数の内容を表示するには、ユーザーは「set varname」と入力します
  • すべての変数を表示するには、ユーザーは「set」と入力します

複数の文字列 ("set" "varname" "varcontents") があるかどうか、または "set" しかないかどうかを確認する方法がよくわかりません。

    char command[2][5] = { "set", "clear"};

    printf("prompt> ");
    scanf("%s",inputString);

    if(strncmp(inputString,command[0],5) == 0 )
    {   
        //code to create new struct, display structs etc...
    }
    else if(strncmp(inputString,command[1],5) == 0 )
    {
         //code to clear struct
    }

現在、if ループは、ユーザーが「set」と入力した場合にのみ通過します。おそらく最初の数文字を比較してから、完全な比較を行い、最初の数文字を差し引いて新しい構造体の名前を生成することもできますが、これは複雑すぎるようです。もっと簡単な解決策があるはずです。

どんな助けでも大歓迎です!

4

3 に答える 3

0

1 つの文字列しか読み取っていないため、2 つの scanf を使用して 2 つの文字列を読み取る必要があります。

char arg0[30], arg1[30];
while (scanf("%s %s", arg0, arg1) < 2);

両方の文字列が入力されるまで読み取ります。

お役に立てれば。

于 2013-11-04T14:16:08.787 に答える
0

コードにいくつかの問題があります。まず第一に、空白をスキップするため、scanf は "set variablename variablevalue" を読み取りません。バッファオーバーフローが簡単に発生するため、とにかく安全とは見なされません。特に初心者はfgets()を使用する必要があります。しかし、主な問題は別の場所にあります。次のスニペットを検討してください。

scanf("%s", inputString);

「set xyz 12」と入力するとどうなりますか? scanf は「set」を読み取るだけで、他の入力は無視されます。そのため、他のパラメーター 'xyz' と '12' をチェックしても意味がありません。多分あなたは次のようなものを使いたいです

scanf("%s %s %s", inputString1, inputString2, inputString3);

しかし、私はそれに反対し、むしろ fgets() を使用することをお勧めします。それとは別に、すでに処理した文字をスキップするには、単純なポインター演算が必要です。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main (){
  char* command[] = { "set", "clear"};
  char input[256], varName[256], varContents[256];
  char* pointer = input;
  int i = 0;
  printf("prompt>");
   fgets(input, 255, stdin);
  if(strncmp(pointer, command[0], strlen(command[0])) == 0 ){
    pointer += strlen(command[0]) + 1;
    while(*pointer != ' ' && *pointer != '\n'){
      varName[i] = *pointer;
      pointer++;
      i++;
    }
    if(*pointer == '\n'){ printf("Not enough arguments"); return 1; }
    varName[i] = '\0';
    pointer++;
    i = 0;
    while(*pointer != ' ' && *pointer != '\n'){
      varContents[i] = *pointer;
      pointer++;
      i++;
    }
    varContents[i] = '\0';
    //code to create new struct, display structs etc...
    printf("Set VarName: %s VarContents: %s\n", varName, varContents);
  }else if(strncmp(pointer, command[1], strlen(command[1])) == 0 ){
    //code to clear struct
  }
  return 0;
}
于 2013-11-04T14:12:26.953 に答える