【问题标题】:compiler does not allow me to edit the passed string [duplicate]编译器不允许我编辑传递的字符串 [重复]
【发布时间】:2017-12-06 18:23:27
【问题描述】:

我环顾四周,在其他问题中找不到我的问题的解决方案。出于某种原因,当我运行我的程序时出现分段错误,这似乎是因为我正在更改给定字符串。我尝试将指针传递给 char 指针并对其进行编辑,但无济于事。

我得到了什么:

之前:胡安巴勃罗 分段错误(核心转储)

我的代码:

void rm_char(char* word, int pos){

   printf("before: %s\n", word);

   int len = strlen(word);

   int i;

   i = pos;

   while(word[i+1] != '\0'){

     word[i] = word[i+1];

     i++;
   } 

   word[i] = '\0';

   printf("after: %s\n", word);
} 


int main(void){

   rm_char("juanpablo", 2);

}

【问题讨论】:

  • 编译器的唯一职责是编译代码。如果是这样,剩下的就是代码本身了。

标签: c string segmentation-fault string-literals


【解决方案1】:

来自 C 标准(6.4.5 字符串文字)

7 不确定这些数组是否不同,前提是它们的 元素具有适当的值。 如果程序试图 修改这样的数组,行为未定义。

要避免错误,您可以调用函数

char s[] = "juanpablo";   

rm_char( s, 2 );

考虑到最好使用类型size_t而不是类型int作为第二个参数和声明的变量len

int len = strlen(word);

未在函数中使用。

函数应该像这样声明

char * rm_char(char* word, size_t pos);

这是一个演示程序

#include <stdio.h>
#include <string.h>

char * rm_char(char *word, size_t pos)
{
    size_t n = strlen( word );

    if ( pos < n )
    {
        //memmove( word + pos, word + pos + 1, n - pos );
        do 
        {
            word[pos] = word[pos+1];
        } while ( word[pos++] );
    }

    return word;
}

int main(void) 
{
    char word[] = "juanpablo";

    puts( word );
    puts( rm_char( word, 2 ) );

    return 0;
}

它的输出是

juanpablo
junpablo

【讨论】:

  • 所以,让我看看我是否理解,如果使用 malloc() 和 strcpy() 生成字符串,则无法编辑它,因为它是字符串文字。或者是因为我用双引号传递了一个字符串,“字符串文字”我无法编辑它?
  • @Telegonicaxx 您向函数传递了一个指向字符串文字第一个字符的指针,并使用此指针尝试更改函数内的字符串文字。
  • 感谢来自莫斯科的@Vlad!我真的对这个摸不着头脑。
猜你喜欢
  • 2010-10-13
  • 2011-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-24
  • 2014-12-03
  • 2013-07-08
相关资源
最近更新 更多