【问题标题】:Change argv strings in function in C with pointers使用指针更改 C 函数中的 argv 字符串
【发布时间】:2021-02-24 15:57:20
【问题描述】:

是否可以在函数中更改您在启动时为程序提供的 argv 字符串?不使用退货?我设法用整数来做到这一点(在传递指针时改变它的值),但我正在努力处理字符串。语法会是什么样子?我真的对整个指针的事情感到困惑:D。

void changestrings(char*strings[]){
    char*newstrings[5] = {"a","b","c","d","e"};
    *strings = newstrings;    
}
int main(int argc, char *argv[])
{
    changestrings(&argv);
    (void)argc;
    return 0;
}

【问题讨论】:

    标签: arrays c char arguments c-strings


    【解决方案1】:

    C 中的字符串用char * 表示。这意味着字符串本身是连续存储的,但变量的实际值是内存中的地址,而不是字符串。该地址指向字符串中的第一个字符。

    char *argv[] 表示这些指针的数组。该数组的存储方式相同; argv 的“值”只是指向数组中第一个元素的内存地址。

    当您获取该数组的地址时,您获取的是变量本身的内存地址,而不是其内容。然后,您可以将此地址传递给函数以修改该变量,这就是您在此处所做的。

    这里是固定代码:

    #include <stdio.h>
    
    void changestrings(char **strings[]) { // 1
        char *newstrings[5] = { "a", "b", "c", "d", "e" };
        *strings = newstrings;
    }
    
    int main(int argc, char *argv[]) {
        changestrings(&argv);
        // (void)argc // 2
        printf("%s\n", argv[0]);
        return 0;
    }
    

    (我添加了 printf 以帮助证明更改有效。)

    // 1,您的原始函数有一个char *[] 类型的参数。这是不正确的,因为当您在argv 上使用&amp; 时,您将地址 传递给char *[]。因此,这应该是char **[](或char ***)。

    // 2,我不确定您在尝试什么,但如果您想更改argc 的值,您可以简单地在main 中分配给它,或者获取它的地址并修改它另一个函数。


    请注意,如果您在 main 中定义了新的 char *[],也可以简单地分配给 argv。如果您想更改单个字符串,这会变得有点棘手,因为您需要跟踪数组中有多少个,但该代码看起来像这样:

    #include <stdio.h>
    
    void change_first_string(char *strings[], int strings_length) {
        if (strings_length < 2) return;
        strings[0] = "foo";
    }
    
    int main(int argc, char *argv[]) {
        change_first_string(argv, argc);
        printf("%s\n", argv[0]);
        return 0;
    }
    

    【讨论】:

    • 那个 (void)argc 是这样我不会得到未使用变量的错误。运行 -wall -werror -wextra
    猜你喜欢
    • 2014-10-29
    • 2018-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-10
    • 1970-01-01
    相关资源
    最近更新 更多