通过scanf()输入多个字符串

时间:2010-08-24 09:26:39

标签: c

输入带有多个单词的字符串的语法是什么,即通过scanf()之间的空格而不是gets()

6 个答案:

答案 0 :(得分:16)

是吗

scanf("%[^\t\n]",string);

答案 1 :(得分:4)

char name[50];
printf("Enter your full name: ");
scanf("%[^\n]s",name);

此处[^\n表示scanf( )会在遇到name[ ]之前继续接收\n字符。

答案 2 :(得分:3)

我不认为scanf()是可行的。 如果您知道要阅读的单词数,可以使用

进行阅读
char str1[100], str2[100];
scanf("%s %s", str1, str2);

请注意,这是一个巨大的安全漏洞,因为用户可以轻松输入比分配空间更长的字符串。

如果您不知道单词的数量,则可能需要重新解释您的问题。你需要阅读什么?你为什么不想使用gets(),为什么它必须是scanf()?

答案 3 :(得分:2)

最好使用fgets()而不是scanf()来阅读用户输入行。

如果代码必须使用scanf(),那么

char buf[100];

// Read up to 99 char and then 1 \n
int count = scanf("%99[^\n]%*1[\n]", buf);

if (count == EOF) {
  Handle_EndOfFile();  // or IO error
}

if (count == 0) {  // Input began with \n, so read and toss it
  scanf("%*c");
}

现在为单个单词解析buf

答案 4 :(得分:1)

如果您需要,可以从文件中读取整行:

scanf("%[^\n]\n", line);

现在,您可以使用sscanf获取每个单词:

sscanf(line, "%s", word);
line += strlen(word) + 1;

“line”和“word”是char指针。

请注意线路是如何进入下一个单词的。

答案 5 :(得分:1)

 char field1[40];
 char field2[40];
 char field3[40];
 char field4[40];
 char field5[40];
 char field6[40];
/*
 *  sscanf( workarea, format, field of pointers )   
 * Interpret  [^ ]      as a field ending in a blank
 * Interpret  [^' ']    as a field ending in a blank
 * Interpret [^ |\t]    as a field ending in blank or tab char
 * Interpret [^' '|\t]  as a field ending in blank or tab char
 * Interpret [^ |\t\n]  as a field ending in blank, tabchar or end-of-line
 *
 */
 strcpy(workarea,"Bread milk eggs cheese tomatoes cookies \n");
 i=sscanf(workarea," %[^' '|\t] %[^[' '|\t] %[^' '|\t]  %[^' '|\t] %[^' '|\t] %[^' '|\t|\n] ",
             field1,field2,field3,field4,field5,field6);

此扫描结果为 field1包含" Bread",field2包含" milk",... field6包含" cookies"。在第一个到最后一个单词之间,您可以使用一个或多个空格或制表符 以下cookie的结尾可能是空格,制表符或换行符中的三个之一,它们将被删除而不属于" cookies"。