可能重复:
Problem with processing individual strings stored in an array of pointers to multiple strings in C
好的,所以我正在尝试将字符串的字符串更改为C中的另一个字符串。事实是,每个字符串都是一维数组的元素,所以基本上它们都是一个二维数组,因为字符串本身就是一个数组的角色。无论如何,我在创建代码时遇到问题。甚至可以这样做吗?任何帮助表示赞赏。
以下是代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main ()
{
int i, size;
char **a;
a=(char**)malloc(sizeof(char*));
printf("Enter the size of the array:");
scanf("%d", &size);
for(i=0;i<size;i++){
a[i]=(char*)malloc(sizeof(char)*8);
}
a[3]="Read";
while(*(a[3])!='\0'){
if(*(a[3]) == 'e'){
*(a[3]) = 'r';
}
}
printf("%s\n", a[3]);
system("pause");
return 0;
}
答案 0 :(得分:1)
a=(char**)malloc(sizeof(char*));
printf("Enter the size of the array:");
scanf("%d", &size);
for(i=0;i<size;i++){
a[i]=(char*)malloc(sizeof(char)*8);
}
不。您已分配1 char*
。然后你把它视为size
元素。您需要分配size * sizeof(char*)
个字节。 (请注意,此乘法也可能会溢出。)
a[3]="Read";
糟糕的时期。您正在使用字符串文字a[3]
的位置覆盖"Read"
(之前指向8个字符的分配)。这会泄漏先前的分配,并将不可修改的字符串放入a[3]
。你应该研究strncpy
等。对此。
答案 1 :(得分:0)
您没有为a
分配足够的空间。而不是
a=(char**)malloc(sizeof(char*));
你需要
a=(char**)malloc(sizeof(char*)*size);
显然这必须在阅读size
之后移动。
一旦你解决了这个相当普通的问题,那么基本问题就在这里:
a[3]="Read";
这使得指针a[3]
指向一个无法修改的文字。相反,您需要将该文字的内容复制到a[3]
。像这样:
strcpy(a[3], "Read");
您必须明白a[3]=...
仅指定指针a[3]
,并且不会修改a[3]
指向的字符串。
现在,如果size
小于4
,那么您的代码显然会出错,因为a[3]
会超出范围,但我猜a[3]
只是短暂的当你调试这个。
你的while循环都错了。从你的评论来看,你想要这样的东西:
char *p = a[3];
while (*p != '\0')
{
if (*p == 'e')
*p = 'r';
p++;
}
无需在C中强制转换malloc
的值,因此请删除强制转换。 sizeof(char)
始终等于1
,因此您也可以删除它。
答案 2 :(得分:0)
此:
a=(char**)malloc(sizeof(char*));
为一个字符串分配空间。您可能想要的是:
char **a = NULL;
size_t number_of_strings = 8; /* for argument's sake */
a = malloc(number_of_strings * sizeof(char*));
if (!a)
return NOT_ENOUGH_MEMORY_ERROR;
此时,您可以取消引用a
的元素,例如a[3]
。你仍然想为这些人分配空间:
char *staticStr = "Read";
a[3] = malloc(strlen(staticStr) + 1);
strncpy (a[3], staticStr, strlen(staticStr) + 1);
从这开始,看看是否重新考虑如何分配内存将帮助您修复其他错误。
一些注意事项:
malloc
的结果
sizeof(char)
来分配内存,总是1 free()
和a[i]
本身使用相应的a
,以防止内存泄漏答案 3 :(得分:0)
当你为:
分配内存时,我看到了另一个问题a = (char **) malloc(sizeof(char *));
您只为一个位置分配内存,但您正在使用size
个位置。然后你的代码应该是:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main ()
{
int i, size;
char **a;
char *ptr;
printf("Enter the size of the array:");
scanf("%d", &size);
a=(char**)malloc(size * sizeof(char*));
for(i=0;i<size;i++){
a[i]=(char*)malloc(sizeof(char)*8);
}
strcpy(a[3], "Read");
ptr=a[3];
while(*ptr!='\0'){
if(*ptr == 'e'){
*ptr = 'r';
}
ptr++;
}
printf("%s\n", a[3]);
system("pause");
return 0;
}
当然,你需要释放分配的内存。
在你尝试将'e'更改为'r'的同时,你总是指向相同的字符。你需要一个新的指针来抛出数组。
答案 4 :(得分:0)
你的while循环没有做任何事情。
while(*(a[3])!='\0'){
if(*(a[3]) == 'e'){
*(a[3]) = 'r';
}
}
它不会使指针前进,只是将它保持在第一个位置。
更合适的方法是创建一个临时指针并使用它来遍历字符串
char *temp = a[3];
while (*temp != '\0') {
if (*temp == 'e') *temp = 'r';
temp++;
}