【问题标题】:Reading from argv in C从 C 中的 argv 读取
【发布时间】:2015-03-22 17:47:34
【问题描述】:

我想读取三个文件的路径(例如,“../c/..file”)和一个来自 argv[] 的 long 并将它们绑定到三个已经创建的 char* ,还有一个long 值称为 num。

这是我的主要功能:

int main(int argc, char* argv[]){

    char* file1 = NULL;
    char* file2 = NULL;
    char* file3 = NULL;
    long num = 0;

    //copy the file paths to the char*'s
    strcpy(file1, argv[1]);
    strcpy(file2, argv[2]);
    strcpy(file3, argv[3]);
    // convert from string to long int
    num = strtol(argv[4],NULL,0);

}

但是这不起作用,并且文件的文件名和 long 的值不会像他们应该的那样最终出现在变量上。

我该如何解决这个问题?

在我的程序中,我检查了 argc 值以确保我没有传递错误的东西,但在这里我以这种方式编写函数只是为了说明我的问题。

【问题讨论】:

  • 您正在尝试将strcpy 您的argv 字符串转至NULL 地址。要么按照@jschultz410 在他的回答中所说的去做,要么使用strdup 而不是strcpy
  • @lurker:请注意strdup 不是标准C。
  • strdup 是 posix 标准

标签: c


【解决方案1】:

不要将指针指向未指向已分配内存的指针。相反,只需将它们设置为等于 argv 数组中的指针,这些指针已经指向分配的内存。像这样:

int main(int argc, char *argv[])
{
    if (argc < 5)
        fprintf(stderr, "usage: %s <file1> <file2> <file3> <num>\n", argv[0]), exit(1);

    char *file1 = argv[1];
    char *file2 = argv[2];
    char *file3 = argv[3];
    long  num   = strtol(argv[4], NULL, 0);

    /* Do stuff */

    return 0;
}

【讨论】:

    【解决方案2】:

    如果你想从 argv 复制字符串,那么你必须在程序中为这些字符串分配内存。例如

    int main(int argc, char* argv[])
    {
        char *file1, *file2, *file3;
        long num = 0;
    
        if ( argc > 1 )
        {
            file1 = malloc( strlen( argv[1] ) + 1 ); 
            strcpy( file1, argv[1] );
        }
    
        if ( argc > 2 )
        {
            file2 = malloc( strlen( argv[2] ) + 1 ); 
            strcpy( file2, argv[2] );
        }
    
        if ( argc > 3 )
        {
            file3 = malloc( strlen( argv[3] ) + 1 ); 
            strcpy( file3, argv[3] );
        }
    
        if ( argc > 4 )
        {
            num = strtol( argv[4], NULL, 0 );
        }
    
        //...
    

    【讨论】:

    • 为什么要分配字符串长度+1字节? (malloc (strlen ..) +1)
    • @user3019799 字符串还包括函数 strlen 不计算的终止零字符 '\0'。
    【解决方案3】:

    有时我们错过了一些论点,为此我们需要检查是否所有 参数是否给出。

      main(int argc,char *argv[])
      {
             if(argc != 5)
                printf("Error message");
             else{
                 //perofmr your operation what you want
                 }
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-20
      • 2016-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多