如何替换char中的char *
总新手在这里。 我试图替换char *中的字符,但我的程序给出错误
#include int main(int argc, char **argv) { char *mystring ="love is alweys better yoe"; int count = 1; for (count ; count 0x41) && (mystring[count+1] < 0x7A))) { mystring[count] = 0x45; //here occur the freezing printf ("%c\n", mystring[count]); //break; }; }; printf("%s\n",mystring); return 0; }
该
char *mystring ="love is alweys better yoe"
使mystring只读
您需要先将字符串复制到缓冲区中,然后才能进行更改
例如
char mystring[128]; strcpy( mystring , "love is alweys better yoe" );
堆栈分配
char *mystring ="love is alweys better yoe";
这会在只读内存中创建一个字符串文字,您不能随后写入它来更改字符。
你应该像这样初始化你的字符串:
char mystring[] ="love is alweys better yoe";
这将分配一个大小为26字节的字符数组 – 每个字符1个字节,以空字符\0
结尾。
请注意,如果您尝试写入缓冲区的末尾(即超出\0
字符),则可能会入侵为程序中的其他数据分配的内存,这可能会产生不良后果。
堆分配
前面的示例在堆栈上分配内存,并且在当前范围的末尾(通常是您所在的函数)将被释放。 如果您希望内存在函数调用结束后持续存在,则需要在堆上分配它,如下所示:
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);
“在char *中”毫无意义。 你不能改变指针中的“东西”,因为指针中没有任何东西 – 它不包含东西。 它指向事物。 这就是为什么它被称为“指针”,而不是“容器”。
当你写char *mystring ="love is alweys better yoe";
,你让mystring
指向一个字符串文字 。 这是一块专门用于保存文本的内存。 它位于一个特殊的记忆区域, 可能无法改变 。 (文本存储在.exe文件中;在大多数实现中,操作系统将.exe文件加载到内存中,然后将指针指向加载的.exe的那部分。您可能不会更改此内存,因为操作系统禁止它 – 基本上,使创建病毒变得更加困难。)
解决方案:使用可修改的内存块。 这样写: char mystring[] = "love is alweys better yoe";
。 字符串文字仍然存在于程序中,但这会指示程序创建一个缓冲区(在内存中可以更改)并将文字复制到缓冲区中。 此缓冲区的长度与文字的长度完全相同,因此您仍然可能无法附加到字符串 – 仅更改现有字符,或将其剪切掉(通过在中间的某处写入空字节)。