- 締切済み
C言語の質問です。
{a,b,c,x,d,xx,e,x,f,\0} という文字型配列があったとして、xを取り除いて{a,b,c,d,e,f,\0}という配列にしたいのです。 その場合、例えば'd'の前にはxが1つ、'e' の前にはxが3つ、'f'の前にはxが4つありますよね? その数だけそれぞれの位置をずらせばxを取り除ける処理ができると思うのですが、その場合どのようにすれば実現できるでしょうか。 forでループをするというのは何となく分かるのですが、何分初心者なもので、見当がつきません。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- asuncion
- ベストアンサー率33% (2127/6289)
>#2さん >初心者の場合、for()文を使うのは難しいように思います。 それほどの違いはないのではないでしょうか。というのも、 ループの途中に continue; を含まない場合、 初期値設定; while (ループ脱出の条件) { /* 何らかの処理 */ ステップ値; } と for(初期値設定; ループ脱出の条件; ステップ値) { /* 何らかの処理 */ } とは「完全に等価」だからです。
- yaemon_2006
- ベストアンサー率22% (50/220)
char *del_ch(char *str, char ch) { char *sp; int l = 0; for(sp = str; *(sp - l) = *sp; ++ sp) l += (*sp == ch); return str; }
- 和泉 博(@hiroshi09s)
- ベストアンサー率54% (59/109)
この手の問題は、#1さんのように、while()文で処理するほうが思考が楽です。 for()文は、 for(初期値設定; ループ脱出の条件; ステップ値) を理解していないと使えないところから、初心者の場合、for()文を使うのは難しいように思います。 while()文とfor()文の使い方(設定の仕方)等を学ぶには良いかも知れません。 /* By MacOSX ----- 実行結果 ----- abcxdxxexf -> abcdef ----- 例:while()文 ----- a = b = string; while(*b != '\0'){ if (*b != 'x') *a++ = *b; b++; } *a = '\0'; */ #include <stdio.h> int main(void) { char string[]= {'a','b','c','x','d','x','x','e','x','f','\0'}; char *a, *b; printf("%s -> ", string); for(a = b = string; *b != '\0'; b++) { if (*b != 'x') *a++ = *b; } *a = '\0'; printf("%s\n", string); return 0; }
- tsukasa-12r
- ベストアンサー率65% (358/549)
動作確認してませんが、こんな感じかなぁ。 char *psrc; char *pdst; pdst = psrc = aaa; while(*psrc) { if( *psrc != 'x' ) { *pdst = *psrc; pdst++; } psrc++; } *pdst = '\0';