我刚刚写了一个小程序,用C语言读取命令行参数,没什么太难的。 我也在修改它们,例如将参数的第一个字符更改为大写。
我知道你不应该修改字符串文字,因为它可能导致未定义的行为,所以只是想知道*argv[]
中的字符串是否是你不应该更改的文字。
int main(int argc, char *argv[])
根据C11标准草案N1570,§5.1.2.2.1/ 2:
参数
argc
和argv
以及argv
数组指向的字符串应由程序修改,并在程序启动和程序终止之间保留它们最后存储的值。
它们是可以修改的。 这意味着它们不是字符串文字。
但要小心 :上面引用只引用指向字符串的指针,不包括argv[argc]
1中的强制空指针。
根据C11标准草案N1570,§5.1.2.2.1/ 2(与上述相同) 1 :
argv[argc]
应为空指针
笔记:
1感谢@black!
int main(int argc, char *argv[])
argv
是char
的指针数组( 右边的规则 )。 但是在函数参数中指定的数组被视为指向数组元素类型的指针,因此可以说它是指向char的指针。 所以根据main的签名你可以修改它。 否则它必须是指向constant char
指针。
同样根据定义 ,它不是字符串文字。
支持argv
中的字符串的数组是可修改的。
但是你无法知道它们的尺寸。
我会看到(试图)增加字符串大小的代码。
#include #include // this program may behave erraticaly int main(int argc, char **argv) { for (int k = 1; k < argc; k++) { printf("original argv[%d] is %sn", 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 %sn", 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 %sn", k - 1, argv[k - 1]); } return 0; }
在我的机器上,用one two three
参数调用该程序
原始argv [1]是一个 原来的argv [2]是两个 原来的argv [3]是三个 对argv [1]的第一次修改是一个foo argv [2]的第一个修改是foo foo 对argv [3]的第一次修改是foo foo 最终的argv [3]是foo foo吧 final argv [2]是foo foo foo吧吧 final argv [1]是一个foo foo foo bar bar bar吧
以上就是c/c++开发分享argv中的字符串是否可修改?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/560729.html