最近在写程序的时候,发现虽然使用的是一样的输入,但是最后末尾结束的判别条件却千差万别。程序如下,输入的时候都使用的是:hello+回车
<pre name="code" class="cpp">#include"stdio.h"
#include"string.h"
#include"conio.h"
#define N 100
int main(int argc, char* argv[])
{
char str1[N], str2[N], str3[N], str4[N];
printf_s("\ngetch:");
for (int i = 0; i < N; i++)
{
str1[i] = _getch();
if (str1[i] == '\r')
{
break;
}
}
printf_s("\ngetchar:");
for (int i = 0; i < N; i++)
{
str2[i] = getchar();
if (str2[i] == '\n')
{
break;
}
}
printf_s("\ngets:");
gets_s(str3);
printf_s("\nscanf:");
scanf_s("%s", str4, N);
return 0;
}
结果如下图:
而每个字符数组中的元素如下图所示:
很明显当使用scanf()和get()作为录入的时候,当按下回车键之后,末尾都自动以'\0'自动结束,并认为此字符串输入完毕。
而当使用getch()和getchar()却不以回车键而结束,相反,回车作为一个字符存入了该字符串。
虽说都是回车,明显可以看出使用getch()的回车字符为'\r',getchar()的回车字符为'\n'。
\r:回车符,返回到这一行的开头,return的意思。
\n:换行符,到下一行的同一位置,纵坐标相同,new line的意思。
scanf与get的区别,网上是这么说的:
scanf :当遇到回车,空格和tab键会自动在字符串后面添加'\0',但是回车,空格和tab键仍会留在输入的缓冲区中。(注:会影响到下次字符的输入)
gets: 可接受回车键之前输入的所有字符,并用'\0'替代 '\n',回车键不会留在输入缓冲区中。
嗯,发个博文,做个标记,下次遇到就不会像现在这么郁闷了。