如何更改2D数组中的单个字符(C)

时间:2018-02-10 04:06:50

标签: c

如何在C中更改2D数组中的单个字符?我试过但是无法编译......

char *words[50][20];

words[0][0] = "hello";

现在如何将'h'更改为'j'以使其成为“jello”?

1 个答案:

答案 0 :(得分:1)

您不应该尝试这样做,因为修改字符串文字是未定义的行为。合理的做法就是这样做,

const char *p = "Hello";
words[0][0]=malloc(strlen(p)+1);
if(words[0][0]==NULL){
  perror("malloc");
  exit(1);
}
memcpy(words[0][0],p,strlen(p)+1);

请记住,您已声明了char*的二维数组 - 这就是为什么首先使用malloc分配内存然后复制字符串文字的原因。所有这些都可以通过POSIX指定的strdup

来完成
words[0][0]=strdup("Hello");

在C标准中明确提到修改字符串文字是未定义的行为。出于上述原因,您不应该使用您编写的代码。

完成更改后,您可以进行words[0][0][0]='j'之类的更改,这将是正确的代码。

仔细重新考虑您的设计。我们很少需要char*的2d数组吗?你需要它吗?如果不是尝试使用较小的结构使设计更简单。

char *words[50];

现在你可以让每个指针指向其中包含不同字母数的单词。该代码与之前的情况非常相似 - 但不使用words[0][0],而是使用words[0],类似

words[0]=malloc(strlen(p)+1);
...

words[0]=strdup("Hello");

下面给出了关于字符串文字的标准部分,来自6.4.5p7(注意数组意味着字符串文字)

  

如果这些数组的元素具有适当的值,则未指定这些数组是否相同。 如果程序试图修改此类数组,则行为未定义