关于pat并不能使用gets

关于pat不能使用gets

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()会将换行符也存入数组中,上面的代码后三行就是过滤了换行符。

  • 或者用%c循环输入直到遇到换行或结束
#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’

关于pat并不能使用gets

上一篇:CF1500A Going Home 题解


下一篇:设计模式系列——设计原则之开闭原则