用C语言编写具有用户定义名称的输出文件

用C语言编写具有用户定义名称的输出文件,c,C,我是C语言的新手,正在尝试在程序运行之前定义一个输出文件名。我的车出了故障 这是我的密码: #include <stdio.h> int main (int argc, const char * argv[]) { char fname[128]; printf("Enter the file name\n"); scanf("%123s",fname); strcat("/Users/user/Desktop/learn/", fname);

我是C语言的新手,正在尝试在程序运行之前定义一个输出文件名。我的车出了故障 这是我的密码:

#include <stdio.h>

int main (int argc, const char * argv[]) {
    char fname[128];
    printf("Enter the file name\n");
    scanf("%123s",fname);
    strcat("/Users/user/Desktop/learn/", fname);
    strcat(fname, ".txt");

    FILE *fp;
    fp=fopen(fname,"a");
    fprintf(fp, "Testing... OK I think it worked\n");
    return 0;
}
#包括
int main(int argc,const char*argv[]{
char-fname[128];
printf(“输入文件名\n”);
scanf(“%123s”,fname);
strcat(“/Users/user/Desktop/learn/”,fname);
strcat(fname,“.txt”);
文件*fp;
fp=fopen(fname,“a”);
fprintf(fp,“测试……好的,我认为它起作用了”;
返回0;
}

在对strcat的第一次调用中,您将使用字符串文本作为目标指针。因此,您将“/Users/user/Desktop/learn/”与fname关联,并将结果存储在存储“/Users/user/Desktop/learn/”的位置,该位置甚至可能不可写

  • 您没有将
    包含在
    strcat
  • strcat
    的第一个参数必须是指针,而不是字符串文字
  • strcat
    本身不安全,请改用
  • 不要忘记检查
    scanf
    fopen
    的结果
  • 完成后关闭
    fp
  • main
    的签名应该是
    intmain(intargc,char*argv[])

  • 通常也不鼓励使用
    scanf
    ,使用
    fscanf
    sscanf

    这不是
    strcat()
    的工作方式

    我认为有两种方法:

    • 正确使用
      fname
      ,并输入文件名:

      char fname[128];
      strcpy(fname, "/Users/user/Desktop/learn/"); // ok as long as you don't make the 128 too small
      char * input = fname + strlen(fname); // now points after the final /
      printf("Enter the file name\n");
      scanf("%123s",  input); // the 123 is probably not correct
      strncat(fname, ".txt", sizeof fname);
      
      并使用它

      目前,这种方法仍然存在输入限制为123字节的问题,这可能太大了,所以最好暂时忘掉它。这只是为了得到这个想法

      也许
      fgets()
      更好:

      fgets(input, sizeof(fname)-strlen(fname), stdin);
      
    • 使用命令行参数,这是我最喜欢的方法:

      // first check if argc is >= 2, i. e. if the caller has supplied an argument
      char fname[128];
      strcpy(fname, "/Users/user/Desktop/learn/");
      strncat(fname, argv[1], sizeof fname);
      strncat(fname, ".txt", sizeof fname);
      

    试试这个,这对我很有用

    #包括
    #包括
    int main(int argc,const char*const*argv[]
    {
    char-fname[128];
    字符路径[]=“/home/abc/test/”;
    printf(“输入文件名\n”);
    scanf(“%123s”,fname);
    strcat(fname,“.txt”);
    strcat(路径,fname);
    文件*fp;
    fp=fopen(路径“a”);
    fprintf(fp,“测试……好的,我认为它起作用了”;
    fclose(fp);
    返回0;
    }
    
    谢谢大家的评论。这是工作代码:

    #include <stdio.h>
    #include <string.h>
    int main (int argc, const char*const* argv[]) 
    {
    char fname[128];
    strcpy(fname, "/Users/user/Desktop/learn/"); 
    char * input = fname + strlen(fname); 
    printf("Enter the file name\n");
    scanf("%s",  input); 
    strncat(fname, ".txt", sizeof fname);
    printf("The output pathway and file will be called %s\n", fname);
    FILE *fp;
    fp=fopen(fname,"a");    
    fprintf(fp, "Testing... OK I think it worked\n");
    fclose(fp);    
    return 0;
    }
    
    #包括
    #包括
    int main(int argc,const char*const*argv[]
    {
    char-fname[128];
    strcpy(fname,“/Users/user/Desktop/learn/”;
    char*input=fname+strlen(fname);
    printf(“输入文件名\n”);
    扫描频率(“%s”,输入);
    strncat(fname,.txt),fname的大小;
    printf(“输出路径和文件将被称为%s\n”,fname);
    文件*fp;
    fp=fopen(fname,“a”);
    fprintf(fp,“测试……好的,我认为它起作用了”;
    fclose(fp);
    返回0;
    }
    
    你在
    main()
    上的签名是错误的。对于一个新成员来说,这是一种非常严厉的待遇,因为他也是该语言的新手。他又不是叫你做作业什么的。这是一个有隐含问题的有效问题,我们经验丰富的人应该能够回答,并就他如何能更好地提问以及如何学习语言提供一些指导。我知道这有很多错误,但谢谢你的评论。我参加的这门课让我们期待着熟悉CThank you!第一种方法奏效了。在尝试命令行参数之前,我需要更好地使用命令行参数。@Davis“使用命令行参数更好”在本文中是什么意思?这听起来像是一个大问题,但事实并非如此。这是一个家庭作业,所以我使用了第一种有效的方法,第二种方法需要更多的c语言知识,我还没有。@Davis,我不这么认为。用C语言处理用户输入肯定更容易出错,也更具挑战性,并且需要比处理命令行参数更多的知识和谨慎。后者已经在内存中,而前者必须先写入内存。如果键入长路径名,就会发生有趣的事情。应该事后记录,这可能在幸运的情况下起作用,但确实使用了scanf()(永远不要这样做!),并且没有正确使用strncat()的最后一个参数。它也不会在strncat、fopen()之后检查错误。糟糕。
    #include <stdio.h>
    #include <string.h>
    int main (int argc, const char*const* argv[]) 
    {
    char fname[128];
    strcpy(fname, "/Users/user/Desktop/learn/"); 
    char * input = fname + strlen(fname); 
    printf("Enter the file name\n");
    scanf("%s",  input); 
    strncat(fname, ".txt", sizeof fname);
    printf("The output pathway and file will be called %s\n", fname);
    FILE *fp;
    fp=fopen(fname,"a");    
    fprintf(fp, "Testing... OK I think it worked\n");
    fclose(fp);    
    return 0;
    }