gets不安全:gets函数不判断输入是否溢出。因为该函数可以无限读取,所以应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。如果溢出,多出来的字符将被写入到堆栈中,这就覆盖了堆栈原先的内容,破坏一个或多个不相关变量的值。
可以直接用scanf输入字符串数组
用 scanf 给字符数组赋值不同于对数值型数组赋值。前面讲过,给数值型数组赋值时只能用 for 循环一个一个地赋值,不能整体赋值。而给字符数组赋值时可以直接赋值,不需要使用循环。此外从键盘输入后,系统会自动在最后添加结束标志符 ‘\0‘。
# include <stdio.h>
int main(void)
{
char str[10]; //str是string的缩写, 即字符串
printf("请输入字符串:");
scanf("%s", str); /*输入参数是已经定义好的“字符数组名”, 不用加&, 因为在C语言中数组名就代表该数组的起始地址*/
printf("输出结果:%s\n", str);
return 0;
}
要注意的是:但是当读入的字符串中有空格时,一般会采取gets()函数,因为gets()函数遇到换行才会停止读入,但是在PAT刷题的过程中,发现PAT不能使用gets()函数,可以将gets()替换成fgets()函数。
fgets(str[i],200,stdin);
while(str[i]!=‘\n‘)
i++;
str[i]=‘\0‘
fgets()函数会读到有换行符的位置或者规定的数组结束,但是不同于gets()的另一点就是,fgets()会将换行符也存入数组中,上面的代码后三行就是过滤了换行符。
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
char str[100];
char ch;
int i=0;
while(scanf("%c", &ch) && ch != ‘\n‘&& ch != ‘\0‘)
{
str[i++] = ch;
}
str[i]=‘\0‘;
printf("%s\n",str);
return 0;
}
使用scanf逐个读取输入即可。需要注意要将字符串的最后一个赋值为‘\0’
原文:https://www.cnblogs.com/shiff/p/15087441.html