使用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语句,但似乎没有任何工作。

有任何想法吗?

试试这个:

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

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

你可以用fgets(input, 1024, stdin);读取整行fgets(input, 1024, stdin);
其中stdin是与标准输入 (键盘)相关联的文件。
函数fgets()从键盘读取每个字符到第一个换行符:’\ n’(按ENTER键后获得,当然……)。
重要提示:字符’\ n’将成为数组输入的一部分。

现在,您的下一步是validation数组中的所有字符是否输入
从第一个到’\ 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()块中,并且
更重要的是,有必要首先包含头
因为使用了isspace()函数。
代码很简单:while执行永远 ,用户在每次迭代中输入一行, if语句检查是否发生了一些错误。
如果一切正常,那么执行for(;;)语句,它会探索数组输入以观察是否只有空白……或者不是。
for迭代继续到第一个新行’\ n’,或者,出现非空白字符。
当终止时,这意味着最后分析的字符(在*s )是换行符(意味着所有早期字符都是空白),或者不是(意味着输入[]中至少有一些非空白字符,所以输入是普通文本)。

“ethernal” while(1)仅在读取空行时被break (参见第11行的break语句)。

OP说“退出,他们点击[输入]然后再次[输入]”

 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; } 
 #include  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; } 

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

阅读之前,你似乎尝试了一切你不应该尝试过的东西! AC程序员应该 阅读手册,以免他们想要遇到未定义的行为 ,这会引起你所经历的头痛。 详细说明,你不能通过猜测你可以学习Java来学习。

请考虑这是你的教训。 停止猜测并开始阅读fscanf手册)

根据那本手册:

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

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

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

同样,重点是我的…这告诉你, 像大多数其他C标准函数一样, 你需要检查返回值 例如,当你调用fopen时,你会在if (fp == NULL) { /* handle error */ }的行中写一些习语。

你的error handling在哪里? 注意, 返回值不仅仅是二进制选择 ; 在执行n转换的情况下,在以下范围内有n+2可能的返回值: EOF0 .. n尝试使用fscanf 之前 ,您应该了解每个方法的含义。

当你想从下一行读取输入时,你可以使用以下function。

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

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