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 读取字符串
fgets
是 scanf
的一个更安全的替代方案,尤其是在读取字符串时。可以指定最大读取的字符数,包括 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; }