c - 带有字符串变量的 fopen 失败

标签 c

我正在尝试制作一个小程序,将一些信息保存在文件上,从用户那里获取文件内容和名称的输入。由于某种原因,我无法将 file_name 保存到 FILE *open 中。

当输入字符串作为文件名时有效; open = fopen("文件名.txt","w");但当我尝试输入字符串作为变量时则不然。我查遍了所有地方都找不到答案。

我已经包含了 stdio.h 和 string.h

int main (){


    FILE *open;

    char first_name[16],last_name[21];
    char save_name[30],ext[10];
    char file_name[40];
    int a,b;

    printf("This program will take your name and save it in a file.\n");
    printf("Insert your first name:");
    scanf("%s",&first_name);
    printf("Insert your last name:");
    scanf("%s",&last_name);


    do{

        printf("Insert file name with extension:");
        scanf("%[^.].%s", &save_name, &ext);
        //Takes filename lenght, minus the dot
        a = (int)strlen(save_name)-1;
        b = (int)strlen(ext);
        sprintf(file_name,"%s.%s",save_name,ext);

    }while(a>8 || b>3);

//This is where my problem lies...

    open = fopen(file_name,"w");

    if(open==NULL){
        printf("File %s failed to open, shutting down...",file_name);
    }
    else{
        fprintf(open, "%s %s",first_name,last_name);
        printf("\n\nSave successful! File was saved as: %s",file_name);
    }

    fclose(open);
    return 0;
}

最佳答案

问题是您的file_name中有一个前导换行符!换行符是由您的 scanf() 调用以 "%[^.]" 格式添加的(但我不完全确定为什么)。似乎使用 %s 进行字符串输入会自动删除此字符,但 %[^.] 将接受除 . 之外的所有字符(包括空格)。使用它来修复它(跳过换行符):

scanf("\n%[^.].%s", &save_name, &ext);

欢迎评论这条换行符的来源 - 这对我来说是新闻!

PS:在计算 a 时不需要 - 1,因为该点永远不会读入 save_name

关于c - 带有字符串变量的 fopen 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57848484/

相关文章:

c - 通过指针访问多维数组

c - 如何将 Zlib 与 Cmake 链接

c - 将 mach 端口传递给子进程

c - 在 C 中制作 shell 时遇到问题

objective-c - 有什么方法可以标记一个 c 函数或 obj-c 方法以在运行时识别它吗?

c - 在头文件中使用静态函数的优缺点是什么

c - 如何让 Frama-C 在测试中理解按位 AND?

c++ - C/C++ 的脚本语言?

c - 循环被忽略 - 指令仅执行一次

将结构复制到另一个结构的成员