相关疑难解决方法(0)

argv中指向字符串的指针是否可修改?

最近(2016年1月,如果问题持续时间足够长)我们有一个问题argv中的字符串是否可以修改?.
这个答案的评论部分,我们(@ 2501和我)争论它是否真的是可修改的字符串(一个示例字符**argv)或指向字符串指针(示例指针是*argv).

适当的标准报价来自C11标准草案N1570,§5.1.2.2.1/ 2:

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

那些argv可修改指向字符串的指针是什么?

c pointers argv language-lawyer

8
推荐指数
1
解决办法
214
查看次数

按长度对 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)

c sorting string command-line-arguments

7
推荐指数
1
解决办法
123
查看次数

原因 main-C 不是 const

我看到这个main()函数通常被称为:

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

与这些定义相关:

  1. 从技术上讲,对于char** argvchar* argv[]是一个优先于另一个还是可以 100% 互换?
  2. 因为argc字符串和参数字符串(应该是?)都是不可变的,为什么它们不是const?或者这是无关紧要的事情,只是出于惯例/历史目的而被省略了?我想这可以通过以下方式完成:const char **argv = (const char **) argv;但很好奇为什么这还没有完成(例如,是否有理由更改收到的参数?)

c pointers program-entry-point constants

3
推荐指数
1
解决办法
97
查看次数

扩展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的特殊功能.

c c++

1
推荐指数
1
解决办法
523
查看次数