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