gets
char* gets(char* str);
作用
从stdin获取字符串,并把它们作为一个C字符串存入str中,直到遇到换行符(\n)或者文件末尾(EOF)
如果有换行符,则换行符不会被复制到str中
在复制到str的字符之后会自动添加一个终止的 null 字符(\0)
注意:该函数在 C 或 C++ 中不再可用(从 C11 和 C++14 起)
参数
str:指向一个内存块(字符数组)的指针,在该内存块中读取的字符串被复制为C字符串
返回值
读取成功,返回str
读取失败,返回NULL
详情见https://cplusplus.com/reference/cstdio/gets/?kw=gets
例
#include <stdio.h>
int main(void)
{
char str[50];
printf("请输入一个字符串:");
gets(str);
printf("您输入的字符串是:%s\n", str);
return 0;
}
由于会处理输入的回车(换行),所以gets函数不存在输入输出和缓冲区的问题
getchar
int getchar(void);
作用
从stdin中获取单个字符
参数
无
返回值
读取成功,返回读取的字符
读取失败,返回EOF
详情见https://cplusplus.com/reference/cstdio/getchar/?kw=getchar
例
假设从键盘键入 1回车 ,则 1回车 都会保存在缓冲区中,getchar会从缓冲区中拿到一个字符( ‘1’ )存入 c 中,此时缓冲区中还有一个回车
#include <stdio.h>
int main(void)
{
int c;
printf("请输入字符:");
c = getchar();
printf("输入的字符为:");
putchar(c);
return 0;
}
如果有多个getchar,就可以从缓冲区中依次拿一个字符存入对应的变量中,直到缓冲区为空,此时可以重新键入
#include <stdio.h>
int main(void)
{
int c;
printf("请输入字符:");
c = getchar();
printf("输入的字符为:");
putchar(c);
c = getchar();
putchar(c);
c = getchar();
putchar(c);
return 0;
}
通常情况下,会这样使用getchar
#include <stdio.h>
int main(void)
{
int i = 0;
char c = 0;
char a[20] = { 0 };
while ((c = getchar()) != '\n')
{
a[i] = c;
i++;
}
printf("%s\n", a);
return 0;
}
scanf
例
假设从键盘键入 1回车 ,则 1回车 都会保存在缓冲区中,scanf会从缓冲区中拿到一个字符( ‘1’ )存入 c 中,此时缓冲区中还有一个回车
#include <stdio.h>
int main(void)
{
char c = 0;
scanf("%c", &c);
printf("%c", c);
scanf("%c", &c);
printf("%c", c);
return 0;
}
假设从键盘键入 123回车 ,则 123回车 都会保存在缓冲区中,此时arr中的内容为 123\0,缓冲区中还有一个回车
%s读到空白符为止
#include <stdio.h>
int main(void)
{
char arr[20];
char c;
scanf("%s", arr);
printf("%s", arr);
scanf("%c", &c);
printf("%c", c);
return 0;
}
对于%d输入,scanf没有缓冲区问题
因为当scanf以%d读取缓冲区时,会自动跳过空白字符
详情见https://developer.aliyun.com/article/1302049
puts
把一个字符串写入到标准输出 stdout,直到空字符,但不包括空字符,换行符会被追加到输出中。
在VS2022中写如下代码,会报警告
警告 C6054 可能没有为字符串“str”添加字符串零终止符。
#include <stdio.h>
int main(void)
{
char str[50];
printf("请输入一个字符串:");
gets(str);
puts(str);
return 0;
}
原因在于puts是读到空字符为止,而str数组由于没有初始化,puts可能不知道读到什么时候停止
解决方案:str初始化
char str[50] = { 0 };