使用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
可能的返回值: EOF
, 0 .. n
。 在尝试使用fscanf
之前 ,您应该了解每个方法的含义。
当你想从下一行读取输入时,你可以使用以下function。
scanf("%d \n",&a); scanf("%d \n",&b); scanf("%d ",&c);
如果您从命令行提供输入,则在换行后将进行另一次输入。