6

相关代码片段:

char input [1024];

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

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

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

有任何想法吗?

4

6 回答 6

4

尝试这个:

while (1 == scanf("%[^\n]%*c", input)) { /* process input */ }
于 2012-11-27T20:59:24.777 回答
0

正如尚未指出的那样,fgets()这里比scanf().

您可以读取与标准输入(键盘)关联的文件fgets(input, 1024, stdin);
在哪里的整行。 该函数从键盘读取每个字符,直到第一个换行符:'\n'(当然是在按下ENTER键后获得......)。重要提示:字符 '\n' 将成为数组input的一部分。 stdin
fgets()

现在,您的下一步是验证数组input中的所有字符(
从第一个字符到“\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',或者出现一个非空白字符。什么 时候
终止,这意味着保存在 中的最后一个分析字符*s是换行符(意味着所有早期字符都是空白),或者不是(意味着input[]中至少有一些非空白字符,所以输入是普通文本)。

“ethernal”while(1)仅在读取空行的情况下才会被破坏(参见break第 11 行中的语句)。

于 2013-08-23T04:50:44.477 回答
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;
}
于 2013-08-23T17:22:19.513 回答
0

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

在阅读之前,您似乎尝试了所有不应该尝试的东西!AC 程序员应该阅读手册,以免他们遇到未定义的行为,这会导致像您所经历的那样令人头疼的行为。详细地说,你不能像学习Java 一样通过猜测来学习 C。

把这当作你的教训。停止猜测开始阅读fscanf手册)

根据该手册:

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

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

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

同样,重点是我的……这告诉您,与大多数其他 C 标准函数一样,您需要检查返回值例如,当您打电话给fopen您时,请按照if (fp == NULL) { /* handle error */ }.

你的错误处理在哪里?请注意,返回值不仅仅是二进制选择;在n执行转换的地方,n+2可能的返回值范围为:EOF, 0 .. n. 在尝试使用.fscanf

于 2017-05-30T06:30:26.460 回答
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;    
}
于 2017-05-29T20:53:11.187 回答
-2

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

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

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

于 2016-06-22T21:59:11.923 回答