C语言与常用函数
1. scanf的疑难
scanf一般用于读取终端输入,一般的用法可以参考 菜鸟、博客。常用的分隔符为:空格、tab、换行(回车)。
注意:终端输入的所有字符会放到 缓冲区 内,scanf从缓冲区读取和设定格式的字符,多余的字符(包括分隔符)都将留在缓冲区,等待下一次读取。
* 在终端的一次非输入性回车则代表一次输入的完成。
scanf("%d", &num); // 若输入:6\n,则读取完后缓冲区还剩下 \n scanf("%d\n", &num); // 若输入:6\n,则会继续阻塞,这里的 \n 在设定的格式内是需要的,应该再输入一个回车,这个回车会作为输入完成的标识动作,即:6\n\n,剩:\n
在读取缓冲区内容时,开始的分隔符都将跳过,直到读到第一个非空白符,将其和设定格式进行匹配。%c是例外,见下面的例子。
scanf中的占位符 %c 和 %s 间的区别如下:
1)%s:读入字符串,直到读取到分割符为止;使用此占位符时,空格、tab、换行 都会被视为 分割符,是多个输入间的分割。分隔符存在于缓冲区,但是不作为 %s 的读入,作为无效输入。
string s1, s2; scanf("%s%s", &s1, &s2);
用换行或空格等作为分割是等效的,如下,s1、s2将分别被赋以 "xxx"、"yyy"。
// input 1: xxx yyy // input 2: xxx yyy
2)%c:读入一个字符;对于此占位符,空格、tab、换行 都会被视为有效字符,可以用 getchar() 拿走缓冲区的3类占位符。
// input:123 55(enter) char* s; s = (char*)malloc(10); // assign enough space scanf("%s", s); // s: "123" scanf("%c", s); // s: " 23", replace the first character with ' '