天天看点

【C】scanf和gets函数警告正文开始

写在前面的话:
  1. 版权声明:本文为博主原创文章,转载请注明出处!
  2. 博主是一个小菜鸟,并且非常玻璃心!如果文中有什么问题,请友好地指出来,博主查证后会进行更正,啾咪~~
  3. 每篇文章都是博主现阶段的理解,如果理解的更深入的话,博主会不定时更新文章。
  4. 本文最后更新时间:2020.7.13

正文开始

字符数组的输入方法

在C语言中,字符数组的输入有两种方法:

  1. 逐个字符输入
  2. 一次性输入整个字符串

1. 逐个字符输入

使用

%c

,例如:

for (i = 0; i < 10; i++)
{
    scanf("%c", &str[i]);
}
           

2. 一次性输入整个字符串

使用

%s

,例如:

char str[10];
scanf("%s", str);
           

需要注意的是,在这里定义的str数组的长度为10,则输入的字符串的长度应小于定义的长度10。若输入hello,则系统自动在输入的 hello 后面加一个

'\0'

结束符。

scanf

若利用一个

scanf

输入多个字符串,要用空格分隔输入的字符串。例如:

#include <stdio.h>

int main()
{
    char str1[10];
    char str2[10];
    
    printf("Please input str: ");
    scanf("%s%s", str1, str2);
    printf("%s %s\n", str1, str2);
    
    return 0;
}
           

由于定义的字符数组长度比输入的字符串的长度要长,所以数组中未被赋值的元素的值会被自动置

'\0'

。利用空格分隔输入的字符串,运行之后结果如下:

Please input str: Hello world!
Hello world!
           

但若将程序改为如下所示:

#include <stdio.h>

int main()
{
    char str[15];
    
    printf("Please input str: ");
    scanf("%s", str);
    printf("%s\n", str);
    
    return 0;
}
           

此时运行结果如下:

Please input str: Hello world!
Hello
           

在这里,空格被认为是字符串之间的分隔符,所以只有空格前的Hello被送入str,导致输出的结果不是我们想要的结果。

gets

若要得到我们想要的结果,可以用

gets()

函数,用于输入字符串。

如下代码:

#include <stdio.h>

int main()
{
    char str[15];
    
    printf("Please input str: ");
    gets(str);
    printf("%s\n", str);
    
    return 0;
}
           

运行结果如下:

Please input str: Hello world!
Hello world!
           

此时便得到了想要的结果。然而同时在编译过后出现了一个警告:

“warning:the 'gets' function is dangerous and should not be used.”

原因是在程序中使用了gets函数,而Linux下的gcc编译器不支持这个函数。可以使用

fgets()

函数替代gets函数解决这个问题。

另外,如果代码如下:

#include <stdio.h>

int main()
{
    int num1;
    int num2;
    char ch;
    
    printf("Please input num1: ");
    scanf("%d", &num1);
    
    printf("Please input ch: ");
    scanf("%c", &ch);
    
    printf("Please input num2: ");
    scanf("%d", &num2);
    
    printf("%d %c %d\n", num1, ch, num2);
    
    return 0;
}
           

则此时输出结果如下:

Please input num1: 2
Please input ch:  Please input num2: 3
2
 3
           

即当程序运行并且输入时,当输入了num1,便隔过ch,直接输入num2。因为ch是字符型变量,当输入了num1后再回车,ch便被认为输入了’\n’,所以出现了上述情况。解决办法是在输入ch之前加一个

getchar()

函数:

#include <stdio.h>

int main()
{
    int num1;
    int num2;
    char ch;
    
    printf("Please input num1: ");
    scanf("%d", &num1);
    
    getchar();
    
    printf("Please input ch: ");
    scanf("%c", &ch);
    
    printf("Please input num2: ");
    scanf("%d", &num2);
    
    printf("%d %c %d\n", num1, ch, num2);
    
    return 0;
}
           

此时结果便是我们想要的结果了。

Please input num1: 2
Please input ch: +
Please input num2: 3
2 + 3
           

继续阅读