通过放置 0 来拆分 c 字符串(段错误)
splitting c-string by putting 0's (segfault)
一个非常简单的C程序:我想在字符串中的某些点处放置0以获取子字符串。但是在第一次尝试时,我在执行时遇到了分段错误:
#include<stdio.h>
#include<string.h>
int main() {
char *a = "eens kijken of we deze string kunnen splitten";
a[4] = '[=10=]'; // this causes the segfault
char *b = a[5]; // sort of guessed this can't work...
printf("%s", a);
}
所以主要问题是:为什么在 a[4] = '[=11=]';
处出现段错误 其次,我想根据字符串索引使用最少的代码拆分此字符串...
您正在尝试更改字符串文字。
char *a = "eens kijken of we deze string kunnen splitten";
字符串文字在 C 中是不可变的。任何更改字符串文字的尝试都会导致未定义的行为。
来自 C 标准(6.4.5 字符串文字)
7 It is unspecified whether these arrays are distinct provided their
elements have the appropriate values. If the program attempts to
modify such an array, the behavior is undefined.
而是声明一个字符数组
char a[] = "eens kijken of we deze string kunnen splitten";
也在此声明中
char *b = a[5];
有错字。应该是
char *b = &a[5];
或
char *b = a + 5;
变量a
指向字符串文字的指针。
这些常量存储在生成的可执行文件的不可写部分中。
尝试向该区域写入任何内容都会导致段错误。
字符串数组(char a[]='literal';
)会将字符串放在正确的位置并允许写入。
编辑:
您的语法(取消)引用 char * 是正确的,但编译器会以不同的方式对待它。
一个非常简单的C程序:我想在字符串中的某些点处放置0以获取子字符串。但是在第一次尝试时,我在执行时遇到了分段错误:
#include<stdio.h>
#include<string.h>
int main() {
char *a = "eens kijken of we deze string kunnen splitten";
a[4] = '[=10=]'; // this causes the segfault
char *b = a[5]; // sort of guessed this can't work...
printf("%s", a);
}
所以主要问题是:为什么在 a[4] = '[=11=]';
处出现段错误 其次,我想根据字符串索引使用最少的代码拆分此字符串...
您正在尝试更改字符串文字。
char *a = "eens kijken of we deze string kunnen splitten";
字符串文字在 C 中是不可变的。任何更改字符串文字的尝试都会导致未定义的行为。
来自 C 标准(6.4.5 字符串文字)
7 It is unspecified whether these arrays are distinct provided their elements have the appropriate values. If the program attempts to modify such an array, the behavior is undefined.
而是声明一个字符数组
char a[] = "eens kijken of we deze string kunnen splitten";
也在此声明中
char *b = a[5];
有错字。应该是
char *b = &a[5];
或
char *b = a + 5;
变量a
指向字符串文字的指针。
这些常量存储在生成的可执行文件的不可写部分中。
尝试向该区域写入任何内容都会导致段错误。
字符串数组(char a[]='literal';
)会将字符串放在正确的位置并允许写入。
编辑: 您的语法(取消)引用 char * 是正确的,但编译器会以不同的方式对待它。