argv 中的字符串是否可以修改?
Are the strings in argv modifiable?
我刚刚用 C 写了一个读取命令行参数的小程序,没什么难的。我也在修改它们,例如将参数的第一个字符更改为大写。
我知道您不应该修改字符串文字,因为它会导致未定义的行为,所以我只是想知道 *argv[]
中的字符串是否是您不应该更改的文字。
int main(int argc, char *argv[])
来自 C11 标准草案 N1570,§5.1.2.2.1/2:
The parameters argc
and argv
and the strings pointed to by the argv
array shall be modifiable by the program, and retain their last-stored
values between program startup and program termination.
它们是可修改的。这意味着它们不是字符串文字。
但是注意:上面的引文仅指指向字符串的指针,不包括argv[argc]
处的强制性空指针1.
来自C11标准草案N1570,§5.1.2.2.1/2(同上)1:
argv[argc]
shall be a null pointer
备注:
关于这句话的事:
I know that you shouldn't modify string literals as it can cause
undefined behavior [...]
"can"?它总是。未定义的行为包括预期的、如同定义明确的和意外的行为。
1感谢@black!
支持argv
中字符串的数组是可修改的
但是你无法知道它们的大小。
看到(试图)增加字符串大小的代码,我会皱眉。
#include <stdio.h>
#include <string.h>
// this program may behave erraticaly
int main(int argc, char **argv) {
for (int k = 1; k < argc; k++) {
printf("original argv[%d] is %s\n", k, argv[k]);
}
printf("\n");
for (int k = 1; k < argc; k++) {
strcat(argv[k], " foo"); // add foo to each argv string
printf("first modification to argv[%d] is %s\n", k, argv[k]);
}
printf("\n");
for (int k = argc; k > 1; k--) {
strcat(argv[k - 1], " bar"); // add bar to each argv string
printf("final argv[%d] is %s\n", k - 1, argv[k - 1]);
}
return 0;
}
在我的机器上,使用 one two three
个参数调用该程序会产生
original argv[1] is one
original argv[2] is two
original argv[3] is three
first modification to argv[1] is one foo
first modification to argv[2] is foo foo
first modification to argv[3] is foo foo
final argv[3] is foo foo bar
final argv[2] is foo foo foo bar bar
final argv[1] is one foo foo foo bar bar bar
我刚刚用 C 写了一个读取命令行参数的小程序,没什么难的。我也在修改它们,例如将参数的第一个字符更改为大写。
我知道您不应该修改字符串文字,因为它会导致未定义的行为,所以我只是想知道 *argv[]
中的字符串是否是您不应该更改的文字。
int main(int argc, char *argv[])
来自 C11 标准草案 N1570,§5.1.2.2.1/2:
The parameters
argc
andargv
and the strings pointed to by theargv
array shall be modifiable by the program, and retain their last-stored values between program startup and program termination.
它们是可修改的。这意味着它们不是字符串文字。
但是注意:上面的引文仅指指向字符串的指针,不包括argv[argc]
处的强制性空指针1.
来自C11标准草案N1570,§5.1.2.2.1/2(同上)1:
argv[argc]
shall be a null pointer
备注:
关于这句话的事:
I know that you shouldn't modify string literals as it can cause undefined behavior [...]
"can"?它总是。未定义的行为包括预期的、如同定义明确的和意外的行为。
1感谢@black!
支持argv
中字符串的数组是可修改的
但是你无法知道它们的大小。
看到(试图)增加字符串大小的代码,我会皱眉。
#include <stdio.h>
#include <string.h>
// this program may behave erraticaly
int main(int argc, char **argv) {
for (int k = 1; k < argc; k++) {
printf("original argv[%d] is %s\n", k, argv[k]);
}
printf("\n");
for (int k = 1; k < argc; k++) {
strcat(argv[k], " foo"); // add foo to each argv string
printf("first modification to argv[%d] is %s\n", k, argv[k]);
}
printf("\n");
for (int k = argc; k > 1; k--) {
strcat(argv[k - 1], " bar"); // add bar to each argv string
printf("final argv[%d] is %s\n", k - 1, argv[k - 1]);
}
return 0;
}
在我的机器上,使用 one two three
个参数调用该程序会产生
original argv[1] is one original argv[2] is two original argv[3] is three first modification to argv[1] is one foo first modification to argv[2] is foo foo first modification to argv[3] is foo foo final argv[3] is foo foo bar final argv[2] is foo foo foo bar bar final argv[1] is one foo foo foo bar bar bar