【发布时间】:2021-11-03 14:19:48
【问题描述】:
我创建的一个函数,我称之为string_deletion,删除特定子字符串的出现并将字符串向左移动子字符串的长度。该函数接受两个参数:指向数组中遇到子字符串第一个字母的位置的指针,以及单词的长度。
函数如下:
void string_deletion(char *s, int m)
{
char *index=s+m;
while(*index!=0)
{
*(index-m)=*(index++);
}
*(index-m)=0;
}
该函数将子字符串之后的所有字符向左移动一个取决于子字符串长度的量,该长度由m 表示。我已将index 指针设置为指向子字符串出现后立即出现的字符,这就是移位开始的标记。循环一直执行,直到遇到NUL 字符,然后退出循环。最后,NUL 被附加到字符串的末尾。
虽然主代码的其他部分无缝工作,但在必要时调用此特定函数会使程序停止工作并产生错误。这是什么原因?
这是完整的代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<limits.h>
int string_len(char *s)
{
int i=0;
char *m=s;
while(*m!=0)
{
i++;
m++;
}
return i;
}
void word_enter(char *word_search)
{
char r;
char *m=word_search;
while((r=getchar())!=EOF)
{
if(r=='\n')
{
*m=0;
break;
}
else
{
*(m++)=r;
}
}
}
void string_disp(char *s)
{
char *d=s;
while(*d!=0)
{
putchar(*(d++));
}
}
int string_comp(char *s, char *m)
{
int stringlength_one=string_len(s);
int stringlength_two=string_len(m);
char *s_one=s;
char *s_two=m;
if(stringlength_one!=stringlength_two)
{
return 1;
}
else
{
while(*s_one!=0)
{
if(*s_one!=*s_two)
{
return 1;
}
s_one++;
s_two++;
}
}
return 0;
}
void string_deletion(char *s, int m)
{
char *index=s+m;
while(*index!=0)
{
*(index-m)=*(index++);
}
*(index-m)=0;
}
void string_search(char *s,char *d)
{
char *m=s;
char word_buffer[20];
char *buffer_index=word_buffer;
while(m!=&s[string_len(s)-string_len(d)+1])
{
buffer_index=word_buffer;
if(*m==*d)
{
int i=0;
char *r=m;
while(i<=string_len(d) && *r!=0)
{
*(buffer_index++)=*(r++);
i++;
}
*buffer_index=0;
if(string_comp(word_buffer,d)==0)
{
printf("\nInvoking deletion sequence\n");
string_deletion(m,string_len(d));
}
}
m++;
}
}
int main(void)
{
int pos;
char main_string[100],word[20];
printf("Enter the main string: ");
word_enter(main_string);
printf("\nEnter the string you wish to delete: ");
word_enter(word);
string_search(main_string,word);
string_disp(main_string);
exit(EXIT_SUCCESS);
}
【问题讨论】:
-
请显示minimal reproducible example。问题可能出在调用代码中。
-
您是否将字符串文字传递给您的函数?也就是说,您是否有类似:
char* test = "I am a string literal";然后使用test... 这意味着您正在尝试修改不可变(常量)字符串。 -
m!=应该是m<,因为字符串长度可以变化不止一。 -
while((r=getchar())!=EOF)这是错误的(但与您的问题无关)。getchar返回int,而不是char。char可能根本无法保存EOF的值。 -
getchar返回一个int。不是wchar_t。你应该使用int,而不是wchar_t。
标签: arrays c function pointers