如何在C语言中不使用scanf函数获取输入?
在C语言中不使用scanf获取输入的方法
下面是几种常用的替代方案,每种都附代码示例和说明:
使用getchar()函数
getchar()会从标准输入(stdin)逐个读取字符,返回读取到的字符(ASCII值),遇到文件结束时返回EOF。适合读取单个字符,或者手动拼接成字符串。
示例1:读取单个字符
#include <stdio.h> int main() { char ch; printf("输入一个字符:"); ch = getchar(); // 读取单个字符 printf("你输入的字符是:%c\n", ch); return 0; }
示例2:读取整行字符串(手动处理)
#include <stdio.h> int main() { char str[100]; int i = 0; printf("输入一行字符串:"); // 逐个读取字符,直到换行或数组满 while ((str[i] = getchar()) != '\n' && i < 99) { i++; } str[i] = '\0'; // 添加字符串结束符 printf("你输入的字符串是:%s\n", str); return 0; }
注意:如果输入前有残留的换行符(比如之前的输入操作留下的),需要先调用getchar()清除。
使用fgets()函数
fgets()专门用于读取一行字符串,会把换行符\n也读入缓冲区,并且自动在末尾添加\0,是比较安全的读取方式(只要指定的缓冲区大小足够)。
示例:读取一行输入
#include <stdio.h> #include <string.h> int main() { char str[100]; printf("输入一行字符串:"); // 从stdin读取最多99个字符(留一个位置给'\0') fgets(str, sizeof(str), stdin); // 去掉末尾的换行符(如果存在) if (str[strcspn(str, "\n")] == '\n') { str[strcspn(str, "\n")] = '\0'; } printf("你输入的字符串是:%s\n", str); return 0; }
strcspn()用来找到换行符的位置,方便我们替换成结束符,避免输出时多一个空行。
使用read()系统调用(仅POSIX系统,如Linux/Unix)
read()是系统级别的输入函数,直接从文件描述符读取字节,stdin的文件描述符是0。需要包含头文件<unistd.h>。
示例:读取输入字节
#include <unistd.h> #include <stdio.h> int main() { char buffer[100]; ssize_t bytes_read; printf("输入内容:"); // 从stdin读取最多99个字节 bytes_read = read(0, buffer, sizeof(buffer) - 1); if (bytes_read > 0) { buffer[bytes_read] = '\0'; // 手动添加结束符 printf("读取到的内容:%s\n", buffer); } else if (bytes_read == 0) { printf("已到达输入末尾\n"); } else { perror("读取失败"); } return 0; }
注意:read()不会自动处理换行符或添加字符串结束符,需要手动处理。另外这个方法在Windows系统下不可用。
额外注意点
- 所有方法都需要注意缓冲区溢出问题,确保定义的数组大小足够容纳输入内容。
- 如果输入包含空格、制表符等特殊字符,
fgets()和手动用getchar()拼接的方式都能正常处理,这一点和scanf("%s")不同(后者会在空格处停止读取)。
内容的提问来源于stack exchange,提问作者Rishabh Dhawad
相关产品推荐
相关产品推荐

