gpt4 book ai didi

c - 使用 scanf 阅读两个长句子

转载 作者:太空狗 更新时间:2023-10-29 15:23:21 26 4
gpt4 key购买 nike

我想使用 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() 语句未读取第二个输入。

如何解决?

最佳答案

这需要一个正确的答案。如果您坚持使用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] 本身就是一个转换说明符,匹配除 a 之外的任何内容新队。所以它后面不应该有 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);
}

关于c - 使用 scanf 阅读两个长句子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44407865/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com