【问题标题】:how to replace a char in char *如何替换字符中的字符 *
【发布时间】:2010-12-02 03:40:07
【问题描述】:

这里的总新手。 我试图替换 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;
}

【问题讨论】:

    标签: c


    【解决方案1】:

    char *mystring ="love is alweys better yoe"
    

    将 mystring 设为只读

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

    例如

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

    【讨论】:

      【解决方案2】:

      堆栈分配

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

      【讨论】:

      • @sje397 - 哎呀,我也注意到了。固定。
      • 请注意,char mystring[] = "some string" 会导致编译器在为其分配字符串和 \0 字符之前考虑数组 mystring 的正确长度。
      【解决方案3】:

      "in the char*" 是没有意义的。您无法更改指针“中”的内容,因为指针“中”没有任何内容 - 它不包含任何内容。它指向事物。这就是为什么它被称为“指针”,而不是“容器”。

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

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

      【讨论】:

      • 我对我看到的一段代码有疑问,它是一个以'UChar *buffer'作为参数的函数,然后执行'buffer[i] = somechar'。这怎么不是只读的? (顺便说一句,UChar 是 typedef uint16_t UChar;)
      • 只读与变量的类型无关。它与值的存储位置有关。指针不存储数据。它指向数据。数据要么是只读的,要么不是只读的。当您编写代码将数组传递给函数时,C 实际上会传递一个指向数组开头的指针。这称为“指针衰减”。该函数将其参数命名为“buffer”,以警告调用者“我要更改数据,所以请不要给我指向只读内存的指针”。
      • avar,指针可以指向可写的东西;只是您的代码中没有。你的只读的原因是因为它指向一个字符串文字,而不是因为它使用char*。您看到的带有UChar* 参数的函数期望调用它的人将传递指向可修改内容的指针。 (事实上​​,指向不可修改数据的指针,比如你的,应该声明为const,这样编译器就不会让你将它们传递给试图修改它们的代码。)
      猜你喜欢
      • 2022-01-03
      • 2023-04-09
      • 1970-01-01
      • 2013-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多