如何在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会使问题变得更容易,当然知道哪些函数是可用的,哪一个是从一开始就使用的最好的函数。
getc
和ungetc
是你的朋友
#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 strict
( http://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,你可以使用fgets
和sscanf
,并使用%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; }