我想阅读输入的所有文字,直到输入换行符号为止。
这是我的代码。
int i=0;
char ch[MAX];
printf("Enter the text\n");
while(true)
{
scanf("%c",&ch[i]);
if(ch[i]=='\n')
break;
i++;
}
但是当我尝试执行它时只读一个单词。
我也试过了scanf("%s",ch);
,但结果是一样的。
答案 0 :(得分:5)
转发评论以回答。
您的代码将有效。您发布的代码会扫描所有内容,直到找到换行符(\n
)。但正如Jonathan Leffler所评论的那样,你绝不会NUL终止你的字符串。要做到这一点,只需使用
ch[i]='\0';
循环后。此外,用户可以输入的字符多于MAX-1
(最后一个\0
的额外字符),这可能会导致buffer overflow。你应该添加一个像
if(i==MAX-1)
break;
在scanf
之前,以防止它溢出。
请注意,scanf("%s",ch);
会一直扫描,直到遇到空格或换行符。
scanf("%[^\n]",ch);
getchar();
以上scanf
扫描所有内容,直到找到换行符并将其放入ch
。 getchar()
然后会从\n
中丢弃stdin
。您还可以通过限制scanf
读入ch
的字符数量来提高安全性。
scanf("%49[^\n]",ch);
上述scanf
最多可扫描49个字符,最后会添加\0
个字符。您可以在那里替换MAX-1
的值。我以50为例。
答案 1 :(得分:4)
在依靠scanf()
获得有效值之前,您并未检查ch[i]
是否成功。这不是一个好主意。
只需使用fgets()
一次读取整行。
答案 2 :(得分:2)
正如@Jonathan Leffler评论的那样,OP的代码不会使字符串终止或阻止缓冲区溢出。
由于代码一次只提取1 char
,因此请使用更简单的fgetc()
。
int i=0;
char ch[MAX];
int single; // Important that this in an int to distinguish EOF from input.
printf("Enter the text\n");
while((single = fgetc(stdin)) != EOF) {
if (i >= (MAX-1)) {
; // Too many, do not save or maybe indicate error
} else {
ch[i++] = single;
}
if (single == '\n') {
break;
}
}
ch[i] = '\0'; // Add termination
答案 3 :(得分:0)
你的代码工作正常。我检查过,它读的不是一个字。
答案 4 :(得分:0)
我希望你的代码对你更好:
int main()
{
int i=0;
char ch[100];
printf("Enter the text\n");
gets(ch); // input text
puts(ch); // output text
return 0;
}
输入:asdf ghjkl zxcvb
输出:asdf ghjkl zxcvb