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