我正在嘗試洗掉甚至出現的子串,例如,如果我有 A11B11C11 并且我想洗掉 11,它將洗掉位置 0 和 2 上的那些,所以它應該看起來像 AB11C。這是我迄今為止擁有的功能,它消除了所有出現的情況。
void removeSubstr(char* s, char* c)
{
int poz = -1;
int i = 0;
int string_length = strlen(s);
int number_length = strlen(c);
while (i < string_length) {
if (strstr(&s[i], c) == &s[i]) {
poz ;
if (poz % 2 == 0) {
string_length -= number_length;
for (int j = i; j < string_length; j ) {
s[j] = s[j number_length];
}
}
}
else {
i ;
}
}
printf("'%d'", poz);
s[i] = '\0';
}
我的方法是,每當我發現一個事件時,我應該將它添加到計數器中,并且每當計數器可以被 2 整除時,我都會洗掉子字串,但它總是會洗掉所有子字串。
編輯:
if (strstr(&s[i], c) == &s[i]) {
poz ;
if (poz % 2 == 0) {
string_length -= number_length;
for (int j = i; j < string_length; j ) {
s[j] = s[j number_length];
}
}
else {
i ; //added this
}
}
正如評論中所說,當出現奇怪的情況時,我也必須增加 i ,現在它可以作業了。
uj5u.com熱心網友回復:
對于初學者,該函式應回傳修改后的源字串。此外,由于子字串在函式內未更改,因此應使用限定符宣告相應的函式引數const
char * removeSubstr( char *s1, const char *s2 );
strstr從源字串的每個字符開始呼叫函式
while (i < string_length) {
if (strstr(&s[i], c) == &s[i]) {
效率不高。子字串最初可以在源字串中不存在。
此外,如果你有這樣的源字串,"A11111"那么結果字串看起來應該是這樣"A111"的,因為在第一個子字串"11"被洗掉后,在這個字串“A111”中,子字串“11”是奇數,不能被洗掉。
但是,使用您的方法,您將獲得結果字串"A1"。那是在你應該寫的 else 陳述句中
else {
i = number_length;
}
我將按照以下方式撰寫函式,如下面的演示程式所示。
#include <stdio.h>
#include <string.h>
char * removeSubstr( char *s1, const char *s2 )
{
size_t pos = 0;
size_t n1 = strlen( s1 ), n2 = strlen( s2 );
for ( char *prev = s1, *next = s1 ; ( next = strstr( prev, s2 ) ) != NULL; prev = next )
{
n1 -= next - prev - n2;
if ( pos % 2 == 0 )
{
memmove( next, next n2, n1 1 );
}
else
{
next = prev n2;
}
}
return s1;
}
int main( void )
{
char s1[] = "A11B11C11";
const char *s2 = "11";
printf( "\"%s\"\n", s1 );
printf( "\"%s\"\n", removeSubstr( s1, s2 ) );
}
程式輸出為
"A11B11C11"
"AB11C"
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/477684.html
上一篇:宣告與定義:GCC錯了嗎?
