c/c++语言开发共享argv中的字符串是否可修改?

我刚刚写了一个小程序,用C语言读取命令行参数,没什么太难的。 我也在修改它们,例如将参数的第一个字符更改为大写。

我知道你不应该修改字符串文字,因为它可能导致未定义的行为,所以只是想知道*argv[]中的字符串是否是你不应该更改的文字。

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

    根据C11标准草案N1570,§5.1.2.2.1/ 2:

    参数argcargv以及argv数组指向的字符串应由程序修改,并在程序启动和程序终止之间保留它们最后存储的值。

    它们是可以修改的。 这意味着它们不是字符串文字。

    要小心 :上面引用只引用指向字符串的指针,不包括argv[argc] 1中的强制空指针。
    根据C11标准草案N1570,§5.1.2.2.1/ 2(与上述相同) 1

    argv[argc]应为空指针


    笔记:


    1感谢@black!

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

    argvchar的指针数组( 右边的规则 )。 但是在函数参数中指定的数组被视为指向数组元素类型的指针,因此可以说它是指向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)!)。

      www.ctvol.com true Article c/c++语言开发共享argv中的字符串是否可修改?

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/560729.html

      (0)
      上一篇 2021年1月28日 上午7:16
      下一篇 2021年1月28日 上午7:19

      精彩推荐