用scanf读两个长句

时间:2017-06-07 08:50:01

标签: 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);
}

输入:

she is beautiful
That is a flower

输出:

she is beautiful

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

如何解决?

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:4)

这需要正确的答案。如果您坚持使用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);
}

在原始字符串中,您有[^\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);
}

答案 2 :(得分:-1)

像这样使用

int main(){

    char a[100];

    while (scanf("%[^\n]%*c", a)==1) {
     printf("%s\n",a); 
    }
    return 0;
  }