如何替换char中的char *

时间:2010-12-02 03:40:08

标签: c

这里的新手总数。 我试图替换char *中的字符,但我的程序出错

#include <stdio.h>

int main(int argc, char **argv)
{
    char *mystring ="love is alweys better yoe";
    int count = 1;

    for (count ;  count < 23; count++)
    {     
    if ((mystring[count] == 0x65 )) //&& ((mystring[count+1] > 0x41) && (mystring[count+1] < 0x7A))) 
    {
      mystring[count] = 0x45; //here occur the freezing
      printf ("%c\n", mystring[count]); 
      //break;
    };
    };

    printf("%s\n",mystring);
    return 0;
}

3 个答案:

答案 0 :(得分:10)

char *mystring ="love is alweys better yoe"

使mystring成为只读

您需要先将字符串复制到缓冲区中才能进行更改

e.g。

char mystring[128];
strcpy( mystring , "love is alweys better yoe" );

答案 1 :(得分:9)

筹码分配

char *mystring ="love is alweys better yoe";

这会在只读内存中创建一个字符串文字,您不能随后写入它来更改字符。

你应该像这样初始化你的字符串:

char mystring[] ="love is alweys better yoe";

这将分配一个大小为26字节的字符数组 - 每个字符1个字节,以空字符\0结束。

请注意,如果您尝试写入缓冲区的末尾(即超出\0字符),则可能会入侵为程序中的其他数据分配的内存,这可能会产生不良后果。< / p>

堆分配

前面的示例在堆栈上分配内存,并且在当前范围的末尾(通常是您所在的函数)将被释放。如果你希望内存在函数调用结束后持续存在,你需要在堆上分配它,如下所示:

int bufferSize = 26;
char* mystring = malloc(bufferSize);
strncpy(mystring, "love is alweys better yoe", bufferSize);

当你完成它时,你需要记住free这段记忆:

free(mystring);

如果free来自调用函数,则需要将char*指针返回给调用者,因此它知道free的哪个内存位置。如果你没有free这个内存,你的程序将泄漏内存。

增加字符串的大小

如果您需要在为其分配内存后重新调整字符串大小,可以使用realloc

char* mybiggerString = realloc(mystring, bufferSize + 10);
strncpy(mystring, "I can fit more in this string now!", bufferSize);

答案 2 :(得分:5)

“在char *中”毫无意义。你不能改变指针中的“东西”,因为指针中没有任何东西 - 它不包含东西。它指向事物。这就是为什么它被称为“指针”,而不是“容器”。

当您撰写char *mystring ="love is alweys better yoe";时,会导致mystring指向字符串文字。这是一块专门用于保存文本的内存。记忆的特殊区域可能无法更改。 (文本存储在.exe文件中;在大多数实现中,操作系统将.exe文件加载到内存中,然后将指针指向加载的.exe的那部分。您可能不会更改此内存,因为操作系统禁止它 - 基本上,要使创建病毒变得更加困难。)

解决方案:使用可修改的内存块。这样写:char mystring[] = "love is alweys better yoe";。字符串文字仍将存在于您的程序中,但这会指示程序创建一个缓冲区(在内存中可以更改)并将文字复制到缓冲区中。此缓冲区的长度与文字的长度完全相同,因此您仍然可能不会将附加到字符串 - 只更改现有字符,或将其剪切掉(通过在中间某处写入空字节)。