0

我希望能够扫描这种格式的字符串

"hello world        !!!!"

{"hello world", "!!!!"}

这 2 个字符串用 1 个以上的空格分隔。我可以解析这个或至少检测scanf中的2个连续空格吗?

4

3 回答 3

2

从您的问题来看,您似乎对有多个空格这一事实不感兴趣,而只是为了解析它们。

不要害怕!单个空格字符*scanf已经忽略了所有空格(包括'\n', '\r','\t''\v'在“C”语言环境中)。因此,以最简单的形式,您可以这样阅读:

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(实际上在所有%*除了%cand之前%[)。


如果你真的想确保至少有两个空格,并且你坚持使用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 */
于 2013-01-15T09:37:29.173 回答
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];
    }
}
于 2013-01-15T13:49:47.363 回答
-1

根据 c++ 参考(http://www.cplusplus.com/reference/cstdio/scanf/

该函数将读取并忽略在下一个非空白字符之前遇到的任何空白字符(空白字符包括空格、换行符和制表符——参见 isspace)。格式字符串中的单个空格验证从流中提取的任意数量的空格字符(包括无)。

我认为你应该使用gets:http ://www.cplusplus.com/reference/cstdio/gets/然后解析返回的字符串。

编辑。使用 fgets(),而不是 gets()

于 2013-01-15T09:29:59.843 回答