C - 分隔输入流中的字符串

时间:2013-09-19 04:15:40

标签: c arrays string input scanf

我的程序应该能够创建新的结构并将它们存储在一个数组中,但是,用于存储和显示的命令会造成困难。

  • 要在数组中创建新的变量struct,用户输入" set varname varcontents
  • 要显示变量的内容,用户输入" set varname"
  • 要显示所有变量,用户输入"设置"

我无法弄清楚如何检查是否有多个字符串("设置"" varname"" varcontents")或者是否有只有"设置"

    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"时才会通过。 我可能会比较前几个字母,然后进行完全比较并减去前几个字符以生成新结构的名称,但这看起来太复杂了,必须有一个更简单的解决方案。

感谢任何帮助!

3 个答案:

答案 0 :(得分:0)

您可以将句子拆分成单词数组,然后您可以比较这些单词并运行您的函数。试一试,如果您想我可以发布代码。

答案 1 :(得分:0)

您的代码中存在一些问题。首先,scanf不会读取“set variablename variablevalue”,因为它会跳过空格。它无论如何都不被认为是安全的,因为它允许缓冲区溢出 - 特别是初学者应该使用fgets()。 但主要问题是在其他地方 - 请考虑以下片段:

scanf("%s", inputString);

如果输入以下内容会发生什么:'set xyz 12'? scanf只是读取'set'而另一个Input将被忽略。因此,检查其他参数'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;
}

答案 2 :(得分:0)

您只读一个字符串,您应该使用两个scanf来读取两个

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

直到输入两个字符串才能读取。

希望这有帮助。