最近(2016年1月,如果问题持续时间足够长)我们有一个问题argv中的字符串是否可以修改?.
在这个答案的评论部分,我们(@ 2501和我)争论它是否真的是可修改的字符串(一个示例字符**argv)或指向字符串的指针(示例指针是*argv).
适当的标准报价来自C11标准草案N1570,§5.1.2.2.1/ 2:
数组指向的参数
argc和argv字符串argv应由程序修改,并在程序启动和程序终止之间保留它们最后存储的值.
那些argv可修改指向字符串的指针是什么?
我正在尝试使用 C 语言从命令行读取单词argv,然后根据它们的长度按降序对它们进行排序。然而,我的排序算法产生了意想不到的输出。
我使用的代码如下:
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
for (int i = 1; i < argc - 1; i++) {
for (int j = 1; j < argc - i - 1; j++) {
if (strlen(argv[j]) < strlen(argv[j + 1])) {
char temp_word[20];
strcpy(temp_word, argv[j]);
strcpy(argv[j], argv[j + 1]);
strcpy(argv[j + 1], temp_word);
}
}
}
puts("\n");
for (int i = 1; i < argc; i++) {
printf("%s ", argv[i]);
}
return …Run Code Online (Sandbox Code Playgroud) 我看到这个main()函数通常被称为:
int main(int argc, char** argv)int main(int argc, char* argv[])int main(void)与这些定义相关:
char** argv和char* argv[]是一个优先于另一个还是可以 100% 互换?argc字符串和参数字符串(应该是?)都是不可变的,为什么它们不是const?或者这是无关紧要的事情,只是出于惯例/历史目的而被省略了?我想这可以通过以下方式完成:const char **argv = (const char **) argv;但很好奇为什么这还没有完成(例如,是否有理由更改收到的参数?)这主要是出于好奇.
在ISO C规范中,如下所述:
参数argc和argv以及argv数组指向的字符串应该可由程序修改,并在程序启动和程序终止之间保留它们最后存储的值.
http://www.open-std.org/JTC1/SC22/wg14/www/docs/n1425.pdf第5.1.2.2.1节启动
不过,我在网上看到你不应该重新分配argv来扩展它,而是复制它.
有没有特定的理由不扩展不影响其他char**的argv,或者这是按惯例吗?
我不知道是否真的需要用附加值来扩展argv,但问题是argv是否是程序POV的特殊功能.