📜  C中scanf()和gets()的区别(1)

📅  最后修改于: 2023-12-03 14:40:25.039000             🧑  作者: Mango

C中scanf()和gets()的区别

在C语言中,scanf()和gets()都是读取标准输入的函数。然而,它们之间存在几个区别,我们需要正确使用它们。

scanf()

scanf()可以读取从标准输入(键盘)输入的数据,并将它们解析为格式化的参数。格式字符串参数指定了我们要读取的数据类型。

例如,下面的代码读取两个整数:

#include <stdio.h>

int main() {
    int a, b;
    printf("Enter two integers: ");
    scanf("%d %d", &a, &b);
    printf("You entered: %d and %d.", a, b);
    return 0;
}

scanf()使用%d格式字符,指定我们要读取的整数类型。

需要注意的是,scanf()读取输入时是以空格、制表符或换行符作为间隔符的。这就是说,如果在输入两个整数时,我们在它们中间打了一个空格键,scanf()将会认为我们输入了三个整数。为避免这种情况,可以在格式字符串间加入空格,以忽略输入时的间隔符。

还有一个问题是缓冲区溢出。如果在scanf()中使用了错误的格式字符,或者输入流中的数据类型与格式字符串不符,程序将会崩溃。因此,我们必须谨慎地检查输入流,以确保输入的数据符合我们的要求。

gets()

gets()函数是C语言中最不安全的函数之一。它可以读取从标准输入流中输入的字符串,并将其存储在指定的缓冲区中。例如,下面的代码读取字符串并打印它:

#include <stdio.h>

int main() {
    char str[50];
    printf("Enter a string: ");
    gets(str);
    printf("You entered: %s", str);
    return 0;
}

如果我们要输入"Hello World!",结果将会是:

Enter a string: Hello World!
You entered: Hello World!

但这种情况很少发生。事实上,gets()是这样一个函数,它会把用户输入的数据存储到指定的缓冲区中,而不检查缓冲区是否具有足够的存储空间。这样,如果用户输入的字符串长度超过我们的缓冲区长度,我们的程序将会崩溃。这种情况被称为缓冲区溢出。

为了解决这个问题,我们可以使用更安全的fgets()函数。它可以指定缓冲区的长度,以避免溢出。例如:

#include <stdio.h>

int main() {
    char str[50];
    printf("Enter a string: ");
    fgets(str, 50, stdin);
    printf("You entered: %s", str);
    return 0;
}

这将只允许用户输入缓冲区大小以内的字符串。注意,fgets()函数可以读取多行文本,因此它会将换行符也读取到缓冲区中。如果你不想在输出时包含换行符,可以使用strtok()等函数删除它们。

总之,在编写C程序时,我们必须仔细考虑我们使用的输入方法,并采取措施防止缓冲区溢出和其他类型的错误。