我希望能够用这种格式扫描字符串
"hello world !!!!"
到
{"hello world", "!!!!"}
这两个字符串以超过1个空格分隔。我可以解析这个或者至少在scanf中连续检测2个空格吗?
答案 0 :(得分:2)
从您的问题来看,似乎您对多个空格不感兴趣,只是为了解析它们。
不要害怕! *scanf
中的单个空格字符已忽略所有空格(包括“C”中的'\n'
,'\r'
,'\t'
和'\v'
环境)。所以在最简单的形式中,你可以这样读:
scanf("%s %s", str1, str2);
当然,您需要进行错误检查。一种安全的方法是:
char str1[100];
char str2[100];
scanf("%99s", str1);
ungetc('x', stdin);
scanf("%*s");
scanf("%99s", str2);
ungetc('x', stdin);
scanf("%*s");
这是一种通常安全的方式(与您的特定问题无关)。
ungetc
+ scanf("%*s")
忽略字符串剩余的内容(如果有的话)。请注意,在第二个scanf("%99s")
之前您不需要任何空格,因为scanf
已经忽略了%s
之前的所有空格(实际上除%*
之外的所有%c
之前和%[
)。
如果你真的想确保至少有两个空格,并且你坚持使用scanf
,你可以这样做:
char str1[100];
char str2[100];
char c;
scanf("%99s", str1);
ungetc('x', stdin);
scanf("%*s");
scanf("%c", &c);
if (c != ' ')
goto exit_not_two_spaces;
scanf("%c", &c);
if (c != ' ')
goto exit_not_two_spaces;
scanf("%99s", str2);
ungetc('x', stdin);
scanf("%*s");
return /* success */
exit_not_two_spaces:
ungetc(c, stdin);
return /* fail */
答案 1 :(得分:2)
此代码可以帮助您
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char a_buf[5][100] = {0}, sep[3] ,*buf = a_buf[0];
int i = 0;
buf = a_buf[0];
while (scanf("%s%2[ ]",buf,sep) > 1) {
if (strlen(sep)==1)
{
buf += strlen(buf);
*buf++ = ' ';
}
else
buf = a_buf[++i];
}
}
答案 2 :(得分:-1)
根据c ++参考(http://www.cplusplus.com/reference/cstdio/scanf/)
该函数将读取并忽略在下一个非空白字符之前遇到的任何空白字符(空白字符包括空格,换行符和制表符 - 请参阅isspace)。格式字符串中的单个空格验证从流中提取的任何数量的空白字符(包括无)。
我认为你应该使用gets:http://www.cplusplus.com/reference/cstdio/gets/然后解析返回的字符串。
EDIT。使用fgets(),而不是gets()