为什么我会遇到分段错误?C、基本代码



为什么我遇到分段错误?与此处发布的其他类似问题不同,在我看来,我似乎并没有尝试访问内存不足的数组索引。

我希望squeeze(char s1[], char s2[])函数做的是从s1中删除s2中出现的每个字符并打印结果。

#include <stdio.h>
void squeeze(char s1[], char s2[]);
int main()
{
squeeze("test string", "ts");

return 0;
}
void squeeze(char s1[], char s2[])
{
int i, j, k;
for (k = 0; s2[k] != ''; k++) {
for (i=j=0; s1[i] != ''; i++)
if (s1[i] != s2[k]) {
s1[j] = s1[i];
++j;
}
s1[j] = '';
}
printf("%s", s1);
}

错误发生在行s1[j] = s1[i];,当我尝试将其分成两行并使用另一个字符作为占位符时,段错误与s1[j]联机。

我也尝试使用 gdb,我可以阅读s1[j]s1[i]

以下是来自 gdb 的段错误消息:

Program received signal SIGSEGV, Segmentation fault.
squeeze (s1=0x555555556007 "test string", s2=0x555555556004 "ts") at main.c:18
18                  s1[j] = s1[i];

我最近开始学习C,我不知道问题是什么。

C 标准不定义尝试写入字符串文本数组的行为。"test string"是字符串文本。

与其将其直接传递给squeeze,不如定义一个char数组,用字符串文字初始化该数组,并将该数组传递给squeeze

char buffer[] = "test string";
squeeze(buffer, "ts");

在此调用中

squeeze("test string", "ts");

您正在尝试更改字符串文本。尽管在与C++相反的 C 中,字符串文本具有非常量字符数组类型,但任何更改字符串文本的尝试都会导致未定义的行为。

您应该声明一个字符数组并使用字符串文字对其进行初始化,例如

char s1[] = "test string";
squeeze( s1, "ts");

此外,该函数应该像

char * squeeze( char s1[], const char s2[] );

而且使用的方法效率低下。

该函数可以按以下方式定义,如下面的演示程序所示

#include <stdio.h>
#include <string.h>
char * squeeze( char s1[], const char s2[] )
{
if ( *s2 )
{
char *p = s1, *q = s1;
do
{
if ( *p == '' || strchr( s2, *p ) == NULL )
{
if ( p != q ) *q = *p;
++q; 
}
} while ( *p++ );
}
return s1;
}
int main( void )
{
char s1[] = "test string";
puts( squeeze( s1, "ts" ) );
}

程序输出为

e ring

最新更新