我想从字符串中替换字符(例如第二个字符)。我的代码怎么了?它可以编译,但是不做我需要的事情会给我一个细分错误。谢谢!
#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';
}
,在编译我的代码
之后~/workspace/pset2/crack/ $ clang -ggdb3 -O0 -std=c11 -Wall -Werror -Wshadow bug.c -lcrypt -lcs50 -lm -o bug
~/workspace/pset2/crack/ $ ./bug
Segmentation fault
您只能修改堆或堆栈中的内存,您的 "abcd"
有一个称为字符串字面的内容,并且属于程序的仅阅读内存空间,无法修改它它在哪里(如果它在任何体面的操作系统下都在运行)。
首先放置在那里的原因是因为string
基本上只是char *
指针,它将指向任何内存空间,并且不在乎它是否在仅读取空间中。(不要与C std::string
混淆)。
要使它可以修改,您必须告诉C,它不是指针,而是一个数组。
char key[] = "abcd";
现在C将此字符串放在堆栈中,您可以随意修改它。
string key="abcd";
string
基本上是 char *
, key
是字符串文字。您尝试修改它,因此分段故障。
我看不到名称 string
的定义,但我认为它是 char *
。
因此在此声明中
string key="abcd";
声明了指向字符串字面的指针。
字符串文字在C中未经修改,任何尝试修改字符串文字结果的尝试中未定义的行为。
来自C标准(6.4.5字符串文字)
7,如果它们的阵列是否明显,则未指定 元素具有适当的值。如果程序尝试 修改这样的数组,行为不确定。
这是因为"abcd"
并未真正复制到您的key
变量中。相反,key
是指向此常数字符串的指针。
如果您想对其进行修改,则可以做到这一点:
int main (int argc, string argv[])
{
char key[] = { "some string" };
key[1]='f';
}