你如何在C中分配子串?

时间:2012-02-07 18:08:12

标签: c string pointers

我试图弄清楚为什么这不起作用:

#include <stdio.h>
int main ()
{
  char *orig = "Hey you guys.";
  char *str;
  str = &orig;
  while(*str++) {
    if (*str == 'y')
        *str = '@';
  }
  puts(orig);
  return 0;
}
// OUTPUT => "Hey you guys."
// Not "he@ @ou gu@s." as expected.

通过分配str =&amp; orig,我认为str将与orig共享相同的内存地址。 我错过了什么?

3 个答案:

答案 0 :(得分:2)

两件事:

  • &orig是指针的地址。也许你想要str = orig。你的编译器应该在这里警告你指针类型不匹配;如果没有,则调高警告级别直到它出​​现。
  • 修改常量文字字符串并不总是有效。使用char orig[] = "Hey you guys."将文字字符串复制到一个名为orig的数组中,您可以安全地修改它。

答案 1 :(得分:2)

(1)用于共享您想要执行的内存str = orig,因为str已经是指针类型。
(2)orig被定义为字符串文字,常量 - 所以你不能修改"Hey you guys.",即使不是通过str访问时,会导致运行时错误。

编辑:问题#3:在你的while循环中,首先增加指针,然后检查它是否为'y'并进行修改。通过这样做 - 你会错过第一个元素。如您所料,"yasdf"将变为"yasdf"而非"@asdf"。 [我认为无论如何你想要的......]

要实现您的目标,您可以遵循以下步骤:[使用strcpy和缓冲区,以避免写入常量内存]

#include <stdio.h>
#include <string.h>
int main ()
{
  char *orig = "Hey you guys.";
  char buff[14]; //the length of orig + 1 byte for '\0'
  char *str = buff; //since str and buff are already pointers
  strcpy(str,orig);
  while(*str) {
    if (*str == 'y')
        *str = '@';
    str++;
  }
  puts(buff);
  return 0;
}

答案 2 :(得分:0)

  1. 你错过了第一个元素
  2. 您无法更改字符串文字
  3. 修改后的代码:
  4. #include <stdio.h>
    
    int main ()
    {
        char orig[] = "Hey you guys.";
        char *str;
        str = orig;
      int i;
        while(*str){
          if (*str == 'y')
                *str = '@';
          *str++;
        }
        puts(str);
      puts(orig);
        return 0;
    }