You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言程序无法接收字符串输入直接执行完成的问题求助

问题分析与修复方案

核心问题原因

  • 输入缓冲区残留换行符:scanf("%s", &name)读取文件名时,只会读取到第一个空白字符(比如输入文件名后按下的回车),这个回车符会留在标准输入缓冲区中。后续调用gets()时,它会直接读取这个残留的换行符,误以为用户已经完成输入,因此跳过了实际的字符串输入步骤。
  • scanf参数错误:name是字符数组名,本身就代表数组首元素的地址,不需要加&,加&会导致类型不匹配(char (*)[100] 和 char*)。
  • gets()函数不安全:该函数已被C标准废弃,它不检查输入长度,一旦用户输入的字符串超过str的容量,会直接导致缓冲区溢出,引发程序崩溃或安全风险。

修复步骤

  1. 清理输入缓冲区的残留换行符,确保后续输入函数能正常读取用户输入。
  2. 替换gets()为安全的fgets(),避免缓冲区溢出。
  3. 修正scanf的参数,移除多余的&。
  4. 增加文件打开失败的错误判断,避免程序在异常情况下崩溃。
  5. 操作完成后关闭文件,确保写入的内容及时同步到磁盘。

修正后的代码

#include <stdio.h>
#include <string.h>

int main()
{
    FILE *filepointer;
    printf("Enter file name with extension:\n");
    char name[100];
    // 修正scanf参数,读取文件名
    scanf("%s", name);
    
    // 清理输入缓冲区中残留的换行符
    getchar();

    // 检查文件是否成功打开
    filepointer = fopen(name, "w");
    if (filepointer == NULL) {
        printf("Failed to open file!\n");
        return 1;
    }

    char str[1024];
    printf("Enter what you want to write\n");
    // 用fgets替代gets,指定最大读取长度,避免缓冲区溢出
    fgets(str, sizeof(str), stdin);
    
    // 移除fgets读取到的换行符(如果存在)
    str[strcspn(str, "\n")] = '\0';

    fprintf(filepointer, "%s", str);
    // 关闭文件,确保内容写入磁盘
    fclose(filepointer);

    return 0;
}

关键修改说明

  • getchar():读取scanf遗留的换行符,让后续的fgets()能正确获取用户输入的字符串。
  • fgets(str, sizeof(str), stdin):从标准输入读取最多sizeof(str)-1个字符,自动在末尾添加字符串终止符'\0',彻底避免缓冲区溢出问题。
  • str[strcspn(str, "\n")] = '\0':利用strcspn找到输入字符串中第一个换行符的位置,将其替换为终止符,避免写入文件时多出不必要的空行。
  • fclose(filepointer):文件使用完毕后必须关闭,否则可能导致写入的内容无法及时保存到磁盘,还会造成系统资源泄漏。
  • 文件打开失败判断:当文件无法打开(比如权限不足、路径无效)时,程序会直接提示错误并退出,避免后续的非法内存操作。

内容的提问来源于stack exchange,提问作者Aswin Pratapsingh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 18:46:03