扫描到新行

时间:2014-12-28 13:56:37

标签: c scanf

我想阅读输入的所有文字,直到输入换行符号为止。

这是我的代码。

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);,但结果是一样的。

5 个答案:

答案 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扫描所有内容,直到找到换行符并将其放入chgetchar()然后会从\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