我想从输入中读取两个长句子,使用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)
你可以使用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)