通过scanf()输入多个字串

通过scanf()输入多个字串,c,C,通过scanf()not gets()输入多个单词的字符串(即中间有空格)的语法是什么 scanf("%[^\t\n]",string); 我认为这在scanf()中是不可能的。 如果你知道你想读的单词数,你可以用 char str1[100], str2[100]; scanf("%s %s", str1, str2); 请注意,这是一个巨大的安全漏洞,因为用户可以轻松地输入一个比分配的空间长的字符串 如果你不知道单词的数量,你可能不得不重新措辞你的问题。你为什么要读它?为什么不使用get

通过scanf()not gets()输入多个单词的字符串(即中间有空格)的语法是什么

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

我认为这在scanf()中是不可能的。 如果你知道你想读的单词数,你可以用

char str1[100], str2[100];
scanf("%s %s", str1, str2);
请注意,这是一个巨大的安全漏洞,因为用户可以轻松地输入一个比分配的空间长的字符串


如果你不知道单词的数量,你可能不得不重新措辞你的问题。你为什么要读它?为什么不使用gets(),为什么必须使用scanf()?

如果需要,可以使用以下命令从文件中读取整行内容:

scanf("%[^\n]\n", line);
现在,您可以使用sscanf获取每个单词:

sscanf(line, "%s", word);
line += strlen(word) + 1;
“line”和“word”是字符指针

注意这条线是如何走向下一个单词的

char name[50];
printf("Enter your full name: ");
scanf("%[^\n]",name);
%[^\n]
转换要求
scanf()
不断将字符接收到
名称[]
,直到遇到
\n
为止。这是一个字符集,以
^
开头表示接受除此之外的任何内容

有关scanf工作原理的详细信息,请参阅。

使用
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

 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);
此扫描会导致 字段1包含“面包”,字段2包含“牛奶”,。。。包含“cookies”的字段6。在第一个到最后一个单词之间,你可以选择一个或多个空格或制表符
结尾的cookie可能是三个空间,选项卡或换行符,它会被删除而不是“cookies”的一部分。

看起来比C++更像C问题,如果我错了请更正我。当然,<>代码< < /> >也是它自己的安全漏洞,一个应该使用<代码> fgs<代码>,没有一个“巨大的安全漏洞”。如果您使用众所周知的scanf format参数,如“scanf(“%99s%99s”,str1,str2)”谢谢gordon,我不知道格式化程序的宽度字段。但是如何处理大于99个字符的单词呢?字符是否被正确丢弃,或者它们是否会在输入缓冲区中逗留并导致下一个格式化程序失败?>99将像strncpy一样处理,并添加“\0”;格式中的字段长度从输入流中读取最大字段长度字符,->下一个格式化程序从剩余字符中读取最大字段长度字符,依此类推on@subhashis:如果输入以
'\t'
'\n'
开头,如
“\t123 456”
,是否有可能接受此选项,在
string
中不读取任何内容。它可以工作,但在我看来,它可以接受无限多的字符。在
scanf中不需要
s
(“%[^\n]s”,name)。而且
s
在这里没有意义<代码>%[^\n]
已请求除新行以外的所有字符。
scanf(“%[^\n]\n”,行)并不总是读取整行。它不会将任何内容保存到
中,因为输入的是
“\n”
“\n”
将保留在
stdin
中<代码>sscanf(行,“%s”,字)
仅由空白组成,则code>不会将任何内容保存到
word
中。