C - 分隔输入流中的字符串
Posted
技术标签:
【中文标题】C - 分隔输入流中的字符串【英文标题】:C - separating strings in the input stream 【发布时间】:2013-09-24 00:44:37 【问题描述】:我的程序应该能够创建新结构并将它们存储在一个数组中,但是用于存储和显示姿势难度的命令。
要在数组中创建一个新的变量结构,用户输入“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”时才会通过。 我可能可以先比较前几个字母,然后再进行全比较并减去前几个字符以生成新结构的名称,但这似乎太复杂了,必须有一个更简单的解决方案。
感谢任何帮助!
【问题讨论】:
在所需类型的 if 块中使用malloc()/calloc()
如果您首先使用strtok
之类的方式解析字符串,这会不会容易得多?
提供更多您预期输入的示例。
【参考方案1】:
您可以将句子拆分为单词数组,然后您可以比较这些单词并运行您的函数。试一试,如果您愿意,我可以发布代码。
【讨论】:
【参考方案2】:您的代码中存在一些问题。首先,scanf 不会读取“set variablename variablevalue”,因为它会跳过空格。无论如何它不被认为是安全的,因为它允许缓冲区很容易溢出 - 特别是初学者应该使用fgets()。 但主要问题在其他地方 - 考虑以下 sn-p:
scanf("%s", inputString);
如果你输入:'set xyz 12'会发生什么? scanf 只会读取“设置”,而其他输入将被忽略。因此,检查其他参数“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;
【讨论】:
【参考方案3】:你只读取一个字符串,你应该使用两个scanf来读取两个
char arg0[30], arg1[30];
while (scanf("%s %s", arg0, arg1) < 2);
在输入两个字符串之前会一直读取。
希望这会有所帮助。
【讨论】:
以上是关于C - 分隔输入流中的字符串的主要内容,如果未能解决你的问题,请参考以下文章
如何在 C# 流中模拟 Java Scanner 的 next() 方法?
字符输入流读取文本文件ReaderFileReaderBufferedReader