C语言中,读取用户输入的字符串是常见的操作。常用的函数有 scanf、gets 和 fgets。fgets 可以指定最大读取字符数,避免缓冲区溢出,而且可以读取整行输入。scanf 函数适合读取单个单词或格式化的输入。避免使用 gets 函数。

1、使用 scanf 读取字符串

scanf 是 C 语言中常用的读取格式化输入的函数,但它有一些局限性,尤其是在处理字符串时可能会导致缓冲区溢出和输入验证问题。

#include <stdio.h>

int main() {
    char buf[100];

    // 读取最多 99 个字符,确保有一个位置留给 null 终止符
    printf("请输入一个字符串:");
    scanf("%99s", buf);

    // 输出读取的字符串
    printf("你输入的字符串是:%s\n", buf);

    return 0;
}

注意: 始终指定输入的宽度,以避免缓冲区溢出。%99s 确保只读取最多 99 个字符,为 null 终止符保留一个位置。

2、使用 fgets 读取字符串

fgetsscanf 的一个更安全的替代方案,尤其是在读取字符串时。可以指定最大读取的字符数,包括 null 终止符,并且它可以读取整个行,包括空格。可以控制最大读取字符数,避免溢出。 它读取整个行,包括空格,直到遇到换行符或指定的缓冲区大小。 与 scanf 不同,fgets 会消耗换行符,因此不会在输入缓冲区留下多余的字符。

#include <stdio.h>

int main() {
    char buf[100];

    // 提示用户输入
    printf("请输入一些文本:");

    // 从标准输入中读取最多 99 个字符
    fgets(buf, sizeof(buf), stdin);

    // 输出用户输入的内容
    printf("您输入的内容是:%s\n", buf);

    return 0;
}

如果输入的字符少于缓冲区大小,fgets 会包含换行符 \n。如果需要去除换行符,可以使用 strcspn 函数来查找并替换它:

#include <stdio.h>
#include <string.h>  // 为了使用 strcspn

int main() {
    char buf[100];

    // 提示用户输入
    printf("请输入一些文本:");

    // 从标准输入中读取最多 99 个字符
    fgets(buf, sizeof(buf), stdin);

    // 如果输入包含换行符,删除它
    buf[strcspn(buf, "\n")] = '\0';

    // 输出用户输入的内容
    printf("您输入的内容是:%s\n", buf);

    return 0;
}

3、使用 getchar 读取单个字符

如果只需要读取单个字符,可以使用 getchar(),它是一个简单且安全的选择。每次 getchar() 读取一个字符。

#include <stdio.h>

int main() {
    char c;

    printf("请输入一个字符串:");

    // 逐个字符读取输入,直到遇到换行符
    while ((c = getchar()) != '\n' && c != EOF) {
        // 输出读取的字符
        putchar(c);
    }

    printf("\n");

    return 0;
}

4、使用 getline(POSIX 系统)

在 POSIX 系统(例如 Linux)中,getline 是另一个可以读取整行输入的函数。与 fgets 不同,getline 会动态分配缓冲区,因此不需要预先定义缓冲区大小。

#include <stdio.h>
#include <stdlib.h>  // 为了使用 malloc 和 free

int main() {
    char *line = NULL;      // 用来存储输入的字符指针
    size_t len = 0;         // 指定缓冲区的初始大小
    ssize_t nread;          // 读取的字符数

    // 提示用户输入
    printf("请输入一行文本:");

    // 使用 getline 动态分配缓冲区并读取输入
    nread = getline(&line, &len, stdin);

    // 检查是否读取成功
    if (nread == -1) {
        printf("输入错误或到达输入末尾\n");
    } else {
        // 输出用户输入的内容
        printf("您输入的内容是:%s\n", line);
    }

    // 释放动态分配的内存
    free(line);

    return 0;
}

5、处理无效输入

在读取字符串时,重要的是要检查输入是否有效并进行处理,防止缓冲区溢出或无效字符输入。

#include <stdio.h>

int main() {
    char buf[100];

    // 提示用户输入
    printf("请输入一些文本:");

    // 从标准输入中读取最多 99 个字符
    if (fgets(buf, sizeof(buf), stdin) == NULL) {
        // 如果 fgets 返回 NULL,表示发生了错误
        printf("读取输入时发生错误\n");
    } else {
        // 如果输入成功,输出用户输入的内容
        printf("您输入的内容是:%s\n", buf);
    }

    return 0;
}

推荐文档

相关文档

大家感兴趣的内容

随机列表