• 締切済み

C言語の文字列に関する質問です。(初心者です)

文字列の文字を削除するにはどのようなアルゴリズムで考えればいいのでしょうか。 例えば文字列を入力した後、文字を入力し、その文字を文字列から削除するプログラムを作る場合、どのような処理でこれを実現できますか?

みんなの回答

回答No.3

strstr()関数を使って、NULLまで繰り返すプログラムですが、合致する文字毎にデータ移動しているところが難点ではあります。 http://www9.plala.or.jp/sgwr-t/lib/strstr.html /* By MacOSX 例えば、文字列を入力した後、文字を入力し、その文字を文字列から削除するプログラム ----- 実行結果 ----- Input string: hello world! Input key: world Result: hello ! Input string: hello world! Input key: l Result: heo word! */ #include <stdio.h> // printf(), fgets() #include <string.h> // strlen(), strstr() #define SIZE 256 int main(void) { char buffer[SIZE], key[SIZE/4]; char *head, *tail, *ptr; int length; /* データ入力 */ printf("Input string: "); fgets(buffer, SIZE - 1, stdin); buffer[strlen(buffer) - 1] = '\0'; // \nを削除 printf("Input key: "); fgets(key, SIZE / 4 - 1, stdin); length = strlen(key); // 削除文字の長さを記録 key[--length] = '\0'; // \nを削除 /* データ加工 */ ptr = buffer; while((ptr = strstr(ptr, key)) != NULL) { head = ptr; // head位置 tail = ptr + length; // tail位置 while(*head++ = *tail++); // \0 まで(含む)、データ移動 } /* 結果の出力 */ printf("Result: %s\n", buffer); return 0; }

  • shiren2
  • ベストアンサー率47% (139/295)
回答No.2

探しているのがBBBだとします。 >AAAABBBCCCCC\0 求めているのはこれですね。 >AAAACCCCC\0CC\0 ですから、BBBを逐次探索して、その先頭アドレスにCCCCC\0を持ってくればOKです。 メモリ系の関数でもいいですし、文字列系の関数でもいいです。 forで回してもいいですね。

回答No.1

一列に並べた椅子を考えればいい。 各椅子には文字は座っていて、空席を作ってはいけない。 特定の文字が削除されたらその空席を詰めなくてはならない。 #include<stdio.h> void remove_char_from_str(char* str, char to_be_remove) { char* dst = str; /* dst: 書き込むためのポインタ */ while ( *str != '\0' ) { if ( *str != to_be_remove ) { /* 削除対象文字でなえれば、それを書き込み、次の席に移動する */ *dst++ = *str; } /* else { なにもしない。 すなわちdstを次の席に進めないことによって空席を詰める } */ ++str; } *dst = '\0'; } int main() { char str[] = "Hello, world of programming"; printf("before: [%s]\n", str); remove_char_from_str(str, 'o'); printf("after: [%s]\n", str); return 0; }

関連するQ&A