C编程 - 改变字符串数组元素的字符

时间:2012-04-03 18:23:29

标签: c arrays string

  

可能重复:
  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;

}

5 个答案:

答案 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);

从这开始,看看是否重新考虑如何分配内存将帮助您修复其他错误。

一些注意事项:

  • 您无需在C
  • 中投射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++;
}