使用scanf阅读两个长句子

Mee*_*egu 5 c string scanf

我想从输入中读取两个长句子,使用scanf()它们在两行中。

码:

int main() {
    char a[100], b[100];
    scanf("%[^\n]s", a);
    scanf("%[^\n]s", b);
    printf("%s\n%s", a, b);
}
Run Code Online (Sandbox Code Playgroud)

输入:

she is beautiful
That is a flower
Run Code Online (Sandbox Code Playgroud)

输出:

she is beautiful
Run Code Online (Sandbox Code Playgroud)

scanf()语句未读取第二个输入。

如何解决?

小智 5

这需要一个正确的答案。如果您坚持使用scanf(),那么只有一种格式字符串是安全的,并且可以完成您想要的操作:

int main() {
    char a[100] = "";
    char b[100] = "";
    scanf("%99[^\n]%*c", a);
    scanf("%99[^\n]%*c", b);
    printf("%s\n%s", a, b);
}
Run Code Online (Sandbox Code Playgroud)

在您的原始字符串中,您有[^\n]s一个错误,因为它[^\n]是一个转换说明符,它匹配换行符以外的任何内容。因此,不应s跟随它。

下一个更改是在99前面。这样可以确保最多99转换字符-再加上一个字节作为终止符0,您可以在数组中精确地得到100个字符。否则,如果用户输入的字符超过99个,则缓冲区将溢出。

最后一个更改是添加%*c%c将匹配任何字符,在这种情况下,匹配后剩下的换行符%[^\n]。但是您对此不感兴趣,只想使用它即可。这就是*它的作用,它将丢弃匹配的结果。


如果可以的话,就fgets()这样使用,在这种情况下使用起来会简单得多:

int main() {
    char a[100] = "";
    char b[100] = "";
    fgets(a, 100, stdin);
    fgets(b, 100, stdin);

    // if needed, strip newlines, e.g. like this:
    size_t n = strlen(a);
    if (n && a[n-1] == '\n') a[--n] = 0;
    n = strlen(b);
    if (n && b[n-1] == '\n') b[--n] = 0;


    printf("%s\n%s", a, b);
}
Run Code Online (Sandbox Code Playgroud)

  • @VidorVistrom,请阅读`fgets()`手册。 (2认同)

Yun*_*Liu 4

你可以使用fgets. 这可能对你有用。

#include <stdio.h>
#include <stdint.h>

int main() {
    char a[100], b[100];

    if (fgets(a, sizeof a, stdin) == NULL) {
        puts("fgets error");
        return -1;
    }

    if (fgets(b, sizeof b, stdin) == NULL) {   //Read blank lines 
        puts("fgets error");
        return -1;
    }

    if (fgets(b, sizeof b, stdin) == NULL) {
        puts("fgets error");
        return -1;
    }

    printf("%s\n%s", a, b);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)