如何在c中使用scanf读取空格?

问题:我需要能够识别连续出现两个空格的时间。

我读过以下问题:

如何从\ n分隔文件中读取字符串

如何用空格读取scanf

我知道scanf问题: http : //c-faq.com/stdio/scanfprobs.html

输入将采用以下格式:

1 5 3 2 4 6 2 1 9 0 

两个空格表示需要处理下一组数据并与其自身进行比较。 线的长度未知,每组中的数字或整数是未知的。 两个空格是分隔下一个数据集的最多空格。

虽然我可以使用fgets和各种内置函数来解决这个问题,但我现在处理scanf问题可能会更容易。 但是,如果情况并非如此,使用fgets,strtok和atoi将完成大部分工作,但我仍需要连续识别两个空格。

下面将采用整数直到输入非整数。

 while(scanf(“%d”,&x)== 1)

我需要做的是读取空格,如果有两个连续的空格,我将使程序与下一组数据做一些不同的事情。

一旦我得到一个白色空间,我不知道该怎么说:

 if((input ==“whitespace”)&&(previousInput ==“whitespace”))
  雅达亚达
 else(input ==“whitespace”)
  雅达亚达
其他 
  雅达亚达

感谢您的时间,感谢您的帮助。

获得的经验:尽管Jonathan Leffler在下面发布了scanf的解决方案,但解决方案对于getc来说更为直接(通过对内部scanf,正则表达式和char的更少了解)。 回想起正则表达式的更好的知识,scanf和char会使问题变得更容易,当然知道哪些函数是可用的,哪一个是从一开始就使用的最好的函数。

getcungetc是你的朋友

 #include  int main(void) { int ch, spaces, x; while (1) { spaces = 0; while (((ch = getc(stdin)) != EOF) && (ch == ' ')) spaces++; if (ch == EOF) break; ungetc(ch, stdin); if (scanf("%d", &x) != 1) break; printf("%d was preceded by %d spaces\n", x, spaces); } return 0; } 

在http://ideone.com/xipm1上演示

编辑 Rahhhhhhhhhh ……我将其作为C ++上传。 这是完全相同的事情,但现在C99 stricthttp://ideone.com/mGeVk

 while ( scanf ( "%c", &x ) == 1 ) 

使用%c可以读取空格字符,只能读取所有数据并存储在数组中。 然后分配char* cptr并将set cptr设置为数组的开头,然后分析你的数组,如果你想读取十进制数,你可以在cptr上使用简单的sscanf而你想要读取十进制数,但是你必须在数组上有一个好位置的指针(关于你想读的数字)

 if (((*(cptr + 1)) == ' ') && ((*cptr)== ' ')) ya da ya da else ((*cptr)== ' ')) ya da ya da sscanf(++cptr, "%d", &x); else ya da ya da 

如果你真的想要scanf类型的function,你可以使用fgetssscanf ,并使用%n说明符来获取scanf,为你的程序提供每个空白跨度开始和结束的偏移量,同时完成其余的工作。

否则,抛弃整个scanf系列。 在我看来,它很可能是标准库中最无用的部分。

你对“白色空间”的定义是什么?

坦率地说,我不认为我想尝试使用scanf()来识别双白空间; 几乎所有其他方法都会容易得多。

但是,如果你坚持做的不是非常敏感,那么你可能想要使用从以下派生的代码:

 #include  #include  int main(void) { int d; char sp[3] = ""; int n; while ((n = scanf("%d%2[ \t]", &d, sp)) > 0) { printf("n = %d; d = %d; sp = <<%s>>", n, d, sp); if (n == 2 && strlen(sp) == 2) printf(" end of group"); putchar('\n'); } return 0; } 

方括号括起一个字符类,在它坚持最多2个字符之前,它包含2个字符。 您可能不得不担心它读取换行符并尝试获取更多数据来满足字符类 – 这可以通过从字符类中删除换行符来解决。 但是它取决于你对空白区域的定义,以及组是否自动以换行符结束。 重置sp[0] = '\0';不会有什么坏处sp[0] = '\0'; 在循环结束时。

或许,你可以更好地逆转字段,在数字之前检测两个空格。 但是在普通情况下会失败,所以你会回到简单的"%d"格式来读取数字(如果失败,你知道你既没有空格也没有数字 – 错误)。 请注意, %d占用前导空格(由标准定义) – 所有这些空格。

我看的越多,我就越不喜欢’ scanf()了。 请提醒我不要在你的大学上课。

这是一个仅使用scanf()函数的解决方案。 我在这个示例中使用了sscanf()来获得大致相同的function。

 #include  int p_1_cnt = 0, p_2_cnt = 0; void process_1(int x) { p_1_cnt++; } void process_2(int x) { p_2_cnt++; } char * input_line = "1 5 3 2 4 6 2 1 9 0"; int main(void) { char * ip = input_line; int x = 0, ws_0 = 0, ws_1 = 0, preceding_spaces = 1, fields = -2; while (sscanf (ip, "%d%n %n", &x, &ws_0, &ws_1) > 0) { ip += ws_0; if ((preceding_spaces) == 1) process_1(x); else process_2(x); preceding_spaces = ws_1 - ws_0; } printf("\np_1_cnt = %d, p_2_cnt = %d", p_1_cnt, p_2_cnt); _fgetchar(); return 0; }