我正在尝试从第二个字符开始阅读argv[1]
,直到argv[1]
中字符串的结尾(忽略第一个字符,这是一个标志)。我怎样才能做到这一点?
我尝试了一些库函数和其他方法,例如将其存储在诸如
之类的变量中char *variable = strncpy(argv[1][1], strlen(argv[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 byte
。 argv[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
(相同的例子和输出)
仔细看看,如果您有其他问题,请告诉我。