• 締切済み

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でループをするというのは何となく分かるのですが、何分初心者なもので、見当がつきません。

みんなの回答

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.4

>#2さん >初心者の場合、for()文を使うのは難しいように思います。 それほどの違いはないのではないでしょうか。というのも、 ループの途中に continue; を含まない場合、 初期値設定; while (ループ脱出の条件) { /* 何らかの処理 */ ステップ値; } と for(初期値設定; ループ脱出の条件; ステップ値) { /* 何らかの処理 */ } とは「完全に等価」だからです。

回答No.3

char *del_ch(char *str, char ch) { char *sp; int l = 0; for(sp = str; *(sp - l) = *sp; ++ sp) l += (*sp == ch); return str; }

回答No.2

この手の問題は、#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; }

回答No.1

動作確認してませんが、こんな感じかなぁ。 char *psrc; char *pdst; pdst = psrc = aaa; while(*psrc) { if( *psrc != 'x' ) { *pdst = *psrc; pdst++; } psrc++; } *pdst = '\0';

関連するQ&A