通过替换字符串的字母来分割C中的错误

时间:2016-12-04 16:06:15

标签: c segmentation-fault cs50

我想从字符串中替换一个字符(例如第二个字符)。 我的代码出了什么问题?它可以编译,但不是做我需要的,它给我一个Segmentation错误。谢谢!

function changeImage(el) {
    $(el).fadeIn( "slow", function() {
        if (el.value == "samsung"){
          document.getElementById("IzabranUredjajSl").src = "Slike/uredjajSamsung.png";
          document.getElementById("prom_vr_kara").innerHTML = "- 5.1” / 2560x1440 ekran <br/> - 12 MP / 5 MP kamere <br/> - Octa-core / 4 GB platforma <br/> - do 32 GB memorije ";
        }
        else if(el.value == "apple"){
            document.getElementById("IzabranUredjajSl").src = "Slike/uredjajApple.png";
            document.getElementById("prom_vr_kara").innerHTML = "- 4.7” / 1334x750 ekran <br/> - 12 MP / 7 MP kamere <br/> - Quad-core / 2 GB platforma <br/> - do 32 GB memorije ";
        }
    });
}

编译完代码后

#define _XOPEN_SOURCE
#include <unistd.h>
#include <stdio.h>
#include <cs50.h>
#include <string.h>

int main (int argc, string argv[])
{
    string key="abcd";
    key[1]='f';
}

3 个答案:

答案 0 :(得分:0)

string key="abcd";

string基本上是char *key是字符串文字。您尝试修改它,因此分段错误。

答案 1 :(得分:0)

我没有看到名称string的定义,但我认为它类似于char *

因此在此声明中

 string key="abcd";

声明了一个指向字符串文字的指针。

字符串文字在C中未经修改,任何修改字符串文字的尝试都会导致未定义的行为。

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

  

7未指明这些阵列是否与它们不同   元素具有适当的值。 如果程序尝试   修改这样的数组,行为是未定义的。

答案 2 :(得分:0)

你只能修改堆或堆栈中的内存,你的"abcd"就是所谓的String Literal并且属于程序的只读内存空间,它不能被修改它在哪里(不管它是否在任何体面的操作系统下运行)。

它放在那里的原因是因为string基本上只是一个char *指针,它会指向任何内存空间并且不关心它是否&& #39; s是否在只读空间中。 (不要与C ++ std::string混淆。)

为了使其可以修改,你必须告诉C它不是指针,而是数组。

char key[] = "abcd";

现在C将把这个字符串放在堆栈中,你可以随意修改它。