我想使用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()
语句未读取第二个输入。
如何解决?
答案 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;
}