使用scanf()读取多行输入

时间:2012-11-27 20:55:26

标签: c scanf

相关代码段:

char input [1024];

printf("Enter text. Press enter on blank line to exit.\n");
scanf("%[^\n]", input);

这将读取整个行,直到用户点击[enter],阻止用户进入第二行(如果他们愿意)。

要退出,他们会再次按[enter]然后再按[enter]。所以我尝试了各种while循环,for循环,以及涉及新行转义序列的scanf()周围的if语句,但似乎没有任何工作。

有什么想法吗?

6 个答案:

答案 0 :(得分:4)

试试这个:

while (1 == scanf("%[^\n]%*c", input)) { /* process input */ }

答案 1 :(得分:0)

正如之前指出的那样,fgets()scanf()更好。

您可以使用fgets(input, 1024, stdin);来阅读整行 其中stdin是与标准输入(键盘)相关联的文件 函数fgets()读取键盘上的每个字符直到第一个换行符:'\ n'(按 ENTER 键后获得,当然......)。
重要事项:字符'\ n'将成为数组输入的一部分。

现在,您的下一步是验证数组中的所有字符输入
从第一个到'\ n',都是空白。
此外,请注意输入中第一个'\ n'之后的所有字符都是垃圾,因此您无需检查它们。

您的计划如下:

char input[1024];
printf("Enter text. Press enter on blank line to exit.\n");
while (1) {
   if (fgets(input, 1024, stdin) == NULL)
     printf("Input Error...\n");
   else {
     /* Here we suppose the fgets() has reached a '\n' character... */
     for (char* s = input; (*s != '\n') && isspace(*s); s++)
        ; /* skipping blanks */
     if (*s == '\n')
        break; /* Blank line */
     else
        printf("%s\n", input); /* The input was not a blank line */
   }
}

该代码必须写在main()块内,并且 更重要的是,有必要在所有之前包括标题<ctype.h>
因为使用了isspace()功能 代码很简单:while执行 永远 ,用户在每次迭代中输入一行, if 句子检查是否有错误发生了。
如果一切正常,那么会执行 for(;;)语句,它会探索数组输入以观察是否只有空白......或者不是。登记/> for 迭代一直持续到第一个新行'\ n',或者很好,出现一个非空白字符。
for 终止时,这意味着最后分析的字符({1}}中保存的是新行(意味着所有早期字符都是空白),或者不是(意味着至少在那里)是输入[] 中的一些非空白字符,因此输入是普通文本)。

  

“ethernal”*s仅在空白行的情况下被破坏   阅读(参见第11行的while(1)陈述)。

答案 2 :(得分:0)

OP说“要退出,他们会点击[enter]然后再次[enter]”

unsigned ConsecutiveEnterCount = 0;
for (;;) {
  char buffer[1024];
  if (fgets(buffer, sizeof(buffer), stdin) == NULL) {
    break;  // handle error or EOF
  }
  if (buffer[0] == '\n') {
    ConsecutiveEnterCount++;
    if (ConsecutiveEnterCount >= 2 /* or 1, not clear on OP intent */) {
      break;
    }
  }
  else ConsecutiveEnterCount = 0;
  // Do stuff with buffer;
}

答案 3 :(得分:0)

#include <stdio.h>
int main(){
    char arr[40];
    int i;
    for( i = 0; i < sizeof(arr); i +=2 ){
        scanf("%c%c",&arr[i],&arr[i+1]);
        if( arr[i] == '\n' && arr[i+1] == '\n' )
            break;
    }
    printf("%s", arr);
    return 0;    
}

答案 4 :(得分:0)

  

...我尝试了各种while循环,for循环,以及涉及新行转义序列的scanf()周围的if语句,但似乎没有任何工作。

阅读之前,您似乎已经尝试过一切不应该尝试过的事情! AC程序员预期 阅读手册 ,以免他们想要遇到未定义的行为,这会导致像你那样的头痛经验丰富。要详细说明,你不能通过猜测来学习C,就像你可以学习Java一样。

考虑这是你的教训。 停止猜测start reading (the fscanf manual)

根据该手册:

  

[匹配一组预期字节(扫描集)中的非空字节序列。

重点是我的。您似乎要描述的是字节序列,这意味着匹配失败 。手册对匹配失败的说法是什么?

  

成功完成后,这些函数将返回成功匹配的和分配的输入项的数量; 如果早期匹配失败,此数字可以为零。如果输入在第一次转换(如果有)完成之前结束,并且没有发生匹配的故障,则应返回EOF。如果在第一次转换(如果有)完成之前发生错误,并且没有发生匹配的故障,则应退回EOF ...

同样,重点是我...这告诉你像大多数其他C标准函数一样,你需要检查返回值例如,当你拨打fopen时,你会在if (fp == NULL) { /* handle error */ }

的路线上写下一些习语

您的错误处理在哪里?请注意,返回值不仅仅是二进制选择;在执行n转化的情况下,n+2可能的返回值范围为:EOF0 .. n。您应该了解每个方法的含义,之前您尝试使用fscanf

答案 5 :(得分:-1)

当您想要从下一行读取输入时,您可以使用以下功能。

scanf("%d \n",&a);
scanf("%d \n",&b);
scanf("%d ",&c);

如果您从命令行提供输入,则在换行后将进行另一次输入。