我創建的一個函式,我稱之為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>/span>
#include<stdlib.h>/span>
#include<string.h>
#include<limit.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=='
')
{
*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("
呼叫洗掉序列
")。)
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("
輸入你想洗掉的字串。")。)
word_enter(word)。
string_search(main_string,word)。
string_disp(main_string)。
exit(EXIT_SUCCESS)。
uj5u.com熱心網友回復:
*(index-m)=*(index )
這是未定義的行為。如果你使用post-或pre-inc/decrement,不要在同一個運算式中再次使用同一個變數。
index[-m] = *index;
index。
uj5u.com熱心網友回復:
問題(或者,至少是一個問題)在你的string_search函式中。你從給定的s引數中提取的子串太長了;因此,你不會得到與給定的d引數匹配的結果,除非你非常幸運。
為了解決這個問題,將while回圈中的測驗條件從i <= string_len(d)改為i < string_len(d),像這樣:
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) { // Use i < string_len ... not i <=.
*(buffer_index ) = *(r )。
i ;
}
*buffer_index = 0;
if (string_comp(word_buffer, d) == 0) {
printf("
呼叫洗掉序列
")。)
string_deletion(m, string_len(d))。
}
}
m ;
}
}
另外,請確保解決這個答案中強調的未定義行為問題(我的MSVC編譯器沒有發現)。
另外,一定要解決這個答案中強調的未定義行為的問題(我的MSVC編譯器沒有發現這個問題,但clang-cl發現了)!
uj5u.com熱心網友回復:
我不會重新發明車輪:
char *string_deletion(char *s。size_t m)。
{
memmove(s, s m, strlen(s m) 1) 。
return s。
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/315459.html
標籤:
上一篇:Rust:從原始指標加載數值
