相关代码段:
char input [1024];
printf("Enter text. Press enter on blank line to exit.\n");
scanf("%[^\n]", input);
这将读取整个行,直到用户点击[enter],阻止用户进入第二行(如果他们愿意)。
要退出,他们会再次按[enter]然后再按[enter]。所以我尝试了各种while循环,for循环,以及涉及新行转义序列的scanf()周围的if语句,但似乎没有任何工作。
有什么想法吗?
答案 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
可能的返回值范围为:EOF
,0 .. n
。您应该了解每个方法的含义,之前您尝试使用fscanf
。
答案 5 :(得分:-1)
当您想要从下一行读取输入时,您可以使用以下功能。
scanf("%d \n",&a);
scanf("%d \n",&b);
scanf("%d ",&c);
如果您从命令行提供输入,则在换行后将进行另一次输入。