如何在C中更改2D数组中的单个字符?我试过但是无法编译......
char *words[50][20];
words[0][0] = "hello";
现在如何将'h'更改为'j'以使其成为“jello”?
答案 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(注意数组意味着字符串文字)
如果这些数组的元素具有适当的值,则未指定这些数组是否相同。 如果程序试图修改此类数组,则行为未定义。