##谨此纪念下 c小程/c大程 学习过程中报过无数次错的 scanf 函数.
##警告: 如果您要阅读这篇文章,请原谅其作者特有的 口齿不清 和 乱用名词.
问题起因:
学c的时候一直搞不明白 scanf 这个函数,尤其是当其牵扯到空格,回车等输入的时候.今天和室友Debug 的时候由Bug顿悟了一些乱七八糟的东西,特于此记录一下.
具体想法:
简而言之, scanf() 函数中的 "" 内的内容或许可以看作是 有序的集合 或者 向量. 使用 scanf 函数时,计算机会将引号中的内容与输入缓存中的内容进行对比,直到输入缓存中的内容无法与引号内的内容对应时停止,比如下面一个函数:
#include <stdio.h>
int main(){
char a='6',b='6'; //初始化,向a,b中输入'6'这一个字符
scanf ("%c sb %c",&a,&b);
//在上面这一行函数中,引号内为["%c"," ","s","b"," ","%c"]这样一个有序的集合.
//其中 %c 可以可看作是包括任何字符的集合.
printf("%c%c",a,b);
return 0;
}
//在执行这一个程序时,如果我们输入 "A sb B" (注意空格),那么我们会得到程序打印的 "AB"
//但是如果我们输入 "A nb B" 那么我们会得到 "A6" (即a中存储了我们输入的"A",但是b中仍然存储的是初始赋予的字符 "6")
//在输入 "A nb B" 后, scanf函数在读到 "n" 的时候会发现其与 "s" 不同而停止.
在这个程序中,如果输入 A sb B ,计算机会打印 AB ,即字符 A 和字符 B 被分别存入了 a,b 内; 但是如果输入 A nb B ,那么只有字符 A 被存入变量 a 中, 之后scanf在读到 "n" 的时候发现其与函数内对应位置的 "s" 不同而停止读取,因此字符 B 没有存入变量 b 中,而留在了输入缓存中,之后也不会打印字符 B.
这样我们便可以解释为什么有时候会出现诸如 scanf("%d %d",&a,&b) 的形式了,该形式可以利用引号内的空格来对应(消掉?)输入缓存的空格,从而实现正确的读取.
这样我们似乎也可以用来消掉 \n, 如下图所示:
## 先水到这里~~,打算猛补一下函数手册先.
## 此外建议在站里搜索一下 scanf("%[^\n]",&a) 中的关于 %[^\n] 的部分,这也可以说是我部分的顿悟来源了.