【问题标题】:add string to given command line argument in C在C中将字符串添加到给定的命令行参数
【发布时间】:2017-03-19 08:47:53
【问题描述】:

您好,我刚开始用 C 语言进行编程,我正在尝试读取文件并将文件名作为不带结尾 .txt 的参数提供。我想在我的代码中添加 .txt:./myexample.exe 文件

如果我使用 file.txt 没有问题,但我不知道如何更改 argv[1] 我试过 char *n = argv[1] + ".txt";它不起作用,我什么都不知道..

int main(int argc, char* argv[]) {
      char *n = argv[1] +".txt";
      FILE *fp1;
      fp1 = fopen(n , "r");

如果我使用char *n = argv[1]+".txt",这就是我得到的结果

错误:二进制 + 的操作数无效(有 'char *' 和 'char *')

【问题讨论】:

标签: c string concatenation command-line-arguments


【解决方案1】:

在您的代码中,

 char *n = argv[1] +".txt";

不做你认为它做的事。在 C 中,+ 不能用于连接 字符串

仅供参考,来自C11,第 6.5.6 章

对于加法,或者两个操作数都应该是算术类型,或者一个操作数应该是 指向完整对象类型的指针,另一个应为整数类型。(递增是 相当于加1。)

两个操作数都不能是指针对象类型。

如果您要连接 字符串,请使用strcat(),但请确保

  • 目标是可修改的(尝试修改字符串文字是 UB)
  • 目标获得了足够的空间来包含最终结果(较短的目标导致访问超出绑定内存调用 UB,再次)。

【讨论】:

    【解决方案2】:

    你不能用 + 连接字符串。使用 strcpy 和 strcat:

    char n[256];
    strcpy(n, argv[1]);
    strcat(n, ".txt");
    

    确保 n 足够大以容纳文件名 + 扩展名。

    【讨论】:

    • 100 不足以容纳任何文件名。例如,至少需要 256 来保存 Linux 上的任何文件名。
    • 感谢提示
    • 在复制之前检查字符串是否适合缓冲区可能是明智之举。
    【解决方案3】:

    要安全地做这件事有点烦人:你需要小心地创建一个足够大的char 数组来保存整个字符串。一种方式:

    size_t arglen=strlen(argv[1]);
    char* filename=malloc(arglen+5); //Enough to hold the whole string
    strcpy(filename,argv[1]);
    strcat(filename,".txt");
    

    以后一定要free指针。

    【讨论】:

      猜你喜欢
      • 2014-04-30
      • 1970-01-01
      • 2021-08-19
      • 1970-01-01
      • 2015-12-26
      • 2011-12-05
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      相关资源
      最近更新 更多