我的代码用于读取字符串的输入,而换行符用作分隔符。但是我的代码没有正确读取输入,输出与输入不同。在我的代码中,我使用%* [\ n] c来读取任何存在的换行符并跳过它,以便在读取下一个字符串时不包括它。
#include<stdio.h>
main()
{
char s[100],s1[100],s2[100];
scanf("%[^\n]s%*[\n]c%[^\n]s%*[\n]c%[^\n]s%*[\n]c",s,s1,s2);
printf("%s%s%s",s,s1,s2);
return 0;
}
我对此计划的投入如下:
this is 1st line
this is 2nd line
this is 3rd line
我的输出是
this is 1st line.N=ö
有人可以更正我的代码。谢谢。
答案 0 :(得分:1)
在发布的代码中,存在缓冲区溢出的风险,因为没有为输入缓冲区指定最大宽度。应始终为安全代码指定此类宽度;记得为终止字符串的空字符留空间。
scanf(" %99[^\n] %99[^\n] %99[^\n]", s, s1, s2);
fgets()
函数更适合读取输入行。请注意,fgets()
在读取输入行时会保留换行符,因此您可能希望在某些情况下删除换行符。此外,如果用户输入的字符数多于指定缓冲区中的字符数,则换行符和某些字符将保留在输入流中。但这与使用scanf()
没有什么不同,因为在IO操作之后,必须始终注意输入流中可能留下的内容。无论如何,使用fgets()
通常比使用scanf()
更不容易出错,并且将用户输入存储在字符串中是有好处的。 sscanf()
函数始终可以在使用fgets()
获得的字符串上使用,但在这种情况下,您仍然可以在调用sscanf()
后使用输入字符串。
另请注意,OP代码中的函数签名必须是以下之一:
int main(void)
int main(int argc, char **argv)
int main(int argc, char *argv[])
以下是使用fgets()
读取然后显示输入行的示例:
#include <stdio.h>
#include <stdlib.h>
#define MAXLINES 25
#define BUF_LEN 1000
int main(void)
{
char lines[MAXLINES][BUF_LEN];
size_t num_lines = 0;
puts("Enter some lines of text (empty line to quit):");
for(num_lines = 0; num_lines < MAXLINES; num_lines++) {
if (fgets(lines[num_lines], BUF_LEN, stdin) == NULL) {
fprintf(stderr, "Error in fgets\n");
exit(EXIT_FAILURE);
}
if (lines[num_lines][0] == '\n') {
break;
}
}
for (size_t i = 0; i < num_lines; i++) {
printf("%s",lines[i]);
}
return 0;
}
答案 1 :(得分:-1)
#include<stdio.h>
main()
{
char s[100], s1[100], s2[100];
scanf("%[^\n] %[^\n] %[^\n]", s, s1, s2);
printf("%s\n%s\n%s\n", s, s1, s2);
}