如何更改指针数组的内容?

所以我有一个程序可以将所有大写字母转换为小写字母。

#include <stdio.h>
#include <stdlib.h>

char v2m(char z)
{
    if(z >= 'A' && z <= 'Z')
        return z += 32;
    else return z;
}

void convert(char ** array,int n)
{
    for(int i = 0; i < n; i++)
        for(int j = 0; (* (array + i))[j] != '\0'; j++)
            (* (array + i))[j] = v2m((* (array + i))[j]);
}

int main()
{
    char * strings[5] = { "Pen","Car","Dev","Lamp","Noon" };
    printf("Before: ");
    for(int i = 0; i < 5; i++)
        printf("\n%s",* (strings + i));
    convert(strings,5);
    printf("\nAfter: ");
    for(int i = 0; i < 5; i++)
        printf("\n%s",* (strings + i));
    return 0;
}

我知道问题在于我无法更改指针数组的内容,并且想知道是否有一种更简单的方法可以在没有用户输入的情况下声明和初始化数组字符串。主要是修改这部分代码。

char * strings[5] = { "Pen","Noon" };
hnlvyou 回答:如何更改指针数组的内容?

您不能修改数组中的字符串是对的,因为您的数组是指向字符串文字的指针数组,而字符串文字根据定义是常量且无法修改,否则会出现未定义的行为。

通常可以在编译时创建数组同时使其可修改的方法是将字符串的最大长度指定为次要大小:

char strings[5][10] = { "Pen","Car","Dev","Lamp","Noon" };

这将创建一个由 5 个数组组成的数组,每个数组包含 10 个字符(或者,如果您愿意,可以创建一个 5x10 字符矩阵),能够保存最多 9 个字符的字符串(加上终止符)。

然而,如果你需要你的函数接受一个 char ** 这将无济于事,因为数组只能 decay 进入指针一次。如果我们使用上面的声明,我们正在处理一个数组数组,因此指针衰减不会应用两次,并且您的函数需要采用 char(*)[10] 作为参数。

要使其在不更改函数签名的情况下工作,您有两种选择:

  1. 创建单独的数组,然后将它们分配给要传递的指针数组:

    char args[5][10] = { "Pen","Noon" };
    char *strings[5];
    
    for (unsigned i = 0; i < 5; i++)
        strings[i] = args[i];
    
    // ...
    
    convert(strings,5);
    
  2. 动态分配字符串:

    char *strings[5];
    
    strings[0] = strdup("Pen");
    strings[1] = strdup("Car");
    // ...
    
    convert(strings,5);
    
    // ...
    
    for (unsigned i = 0; i < 5; i++)
        free(strings[i]);
    

在您的情况下,选项 1 似乎是最简单的。您可以使用不同的变体,例如将其压缩在一行中执行 char *strings[5] = {args[1],args[2],...};

本文链接:https://www.f2er.com/3544.html

大家都在问