【问题标题】:C assign string from argv[] to char arrayC将argv []中的字符串分配给char数组
【发布时间】:2015-04-25 04:14:09
【问题描述】:

我有以下代码从命令行读取文件名并打开该文件:

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv){
    FILE *datei;
    char filename[255];

    //filename = argv[1];
    //datei=fopen(filename, "r");
    datei=fopen(argv[1], "r");
    if(datei != NULL)
        printf("File opened");
    else{
        printf("Fehler beim öffnen von %s\n", filename);
        return EXIT_FAILURE;
    }
    return EXIT_SUCCESS;
}

此示例有效,但我想将命令行中的字符串写入 char 数组并将该 char 数组传递给 fopen(),但出现编译器错误 Error: assignment to expression with array type filename = argv[1];

这个错误是什么意思,我可以做些什么来解决它?

【问题讨论】:

  • 使用strcpy(filename, argv[1]);
  • 在“文件已打开”消息的末尾添加一个 \n。在此指令周围使用大括号以与 else 子句保持一致。
  • 使用strncpy(filename, argv[1], sizeof filename);

标签: c arrays expression variable-assignment argv


【解决方案1】:

您必须将字符串复制到 char 数组中,这不能通过简单的赋值来完成。

简单的答案是strcpy(filename, argv[1]);

这个方法有个大问题:命令行参数可能比filename数组长,导致缓冲区溢出。

因此正确答案:

if (argc < 2) {
    printf("missing filename\n");
    exit(1);
}
if (strlen(argv[1]) >= sizeof(filename)) {
    printf("filename too long: %s\n", argv[1]);
    exit(1);
}
strcpy(filename, argv[1]);
...

您可能希望将错误消息输出到 stderr。 作为旁注,您可能想选择英语或德语,但不要同时使用两者;-)

【讨论】:

  • 一个更简单的解决方案是在char *filename 中保留指针argv[1] 的副本。除非你自己修改它,一个非常糟糕的主意,它的内容在程序执行期间不会改变。
猜你喜欢
  • 1970-01-01
  • 2011-02-07
  • 2012-05-03
  • 2015-06-25
  • 1970-01-01
  • 1970-01-01
  • 2014-06-08
  • 1970-01-01
  • 2022-10-06
相关资源
最近更新 更多