如何在C中读取argv [1] [1 - 直到字符串的结尾]

时间:2018-01-31 05:03:18

标签: c string

我正在尝试从第二个字符开始阅读argv[1],直到argv[1]中字符串的结尾(忽略第一个字符,这是一个标志)。我怎样才能做到这一点?

我尝试了一些库函数和其他方法,例如将其存储在诸如

之类的变量中
char *variable = strncpy(argv[1][1], strlen(argv[1])) 

但它不起作用。

1 个答案:

答案 0 :(得分:1)

你正在遇到关于C中变量和指针的两个基本误解。

让我们从:

开始
 char *variable = strncpy(argv[1][1], strlen(argv[1]))

最大的问题(除了strncpy的不当使用之外)是您尝试将strncpy的返回分配给char *variable,其中char *variable指针-to-char 未初始化并指向无效存储。您尝试分配返回失败,因为strncpy的正确原型是:

char *strncpy(char *dest, const char *src, size_t n);

注意: dest参数。目标必须有足够的存储空间才能在src的前n个字节中接受n个字符. **further note:** if there is no null byte` ,dest中放置的字节数组不是以null结尾的字符串。)

现在,通过聪明或快乐的情况,使用完整strlen的{​​{1}}为argv[1]分配存储空间,并从dest复制确实为{{{{}}提供空间1}}。

您的下一个误解是在argv[1] + 1中使用null byteargv[1][1]的类型为strncpy,而非argv[1][1]。 (尽管您可以使用char来使用 char*地址 - 但不能像上面那样使用。

&argv[1][1]argv[1][1]类型的指针。作为指向char的指针,如果要跳过一个字符,则需要从地址argv[1](或本例中为char *)中读取。现在,如果你声明一个单独的指针,例如,它可能会使事情变得更容易理解。 pointer + 1然后使用argv[1] + 1,但这是一回事。

将它们放在一起,看起来像你想要的那样:

char *p = argv[1];

使用p + 1的示例参数,您将得到:

示例使用/输出

#include <stdio.h>
#include <string.h>

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

    if (argc < 2) 
        return 1;

    size_t len = strlen (argv[1]);
    char variable[len];

    strcpy (variable, argv[1] + 1); 
    printf ("variable : %s\n", variable);

    return 0;
}

为了完整起见,如果您的编译器不支持使用上面+name中使用的可变长度数组(VLA),那么您的选项是声明{{1} }作为固定大小的数组并验证$ ./bin/argv1plus1 +name variable : name 没有比固定大小更多的字符,或者,您只需通过调用char variable[len];(或variable动态地为strlen(argv[1])分配存储空间或variable)。使用malloc的简短示例是:

calloc

(相同的例子和输出)

仔细看看,如果您有其他问题,请告诉我。