如何替换char中的char*

ava*_*var 3 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;
}
Run Code Online (Sandbox Code Playgroud)

And*_*rsK 10

char *mystring ="love is alweys better yoe"
Run Code Online (Sandbox Code Playgroud)

使mystring只读

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

例如

char mystring[128];
strcpy( mystring , "love is alweys better yoe" );
Run Code Online (Sandbox Code Playgroud)


Leo*_*Hat 9

堆栈分配

char *mystring ="love is alweys better yoe";
Run Code Online (Sandbox Code Playgroud)

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

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

char mystring[] ="love is alweys better yoe";
Run Code Online (Sandbox Code Playgroud)

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

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

堆分配

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

int bufferSize = 26;
char* mystring = malloc(bufferSize);
strncpy(mystring, "love is alweys better yoe", bufferSize);
Run Code Online (Sandbox Code Playgroud)

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

free(mystring);
Run Code Online (Sandbox Code Playgroud)

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

增加字符串的大小

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

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


Kar*_*tel 5

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

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

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