• 締切済み

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% (2126/6288)
回答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

  • C言語でのsinxのマクローリン展開について

    課題で、「n 番目の値が、1*10^-8 よりも小さくなるまでの級数を求め任意のxに対するsinxの値をマクローリン展開を利用して近似せよ。」というものが出たので、プログラムを作成してみたのですが、間違った値が出力されてしまいます。以下にプログラムを示しますので、間違っている点の指摘をお願いします。 #include<stdio.h> int main(void) { long double a,b,c,d,n,x,ans,xx; ans = 0; a = c = d = 1; printf("xを入力"); scanf("%lf",&x); b = x; for(n = 1; d >= 1e-8; a *= (n - 1) * n , b *= xx){ xx = x * x; d = b / a; ans += (b * c)/a; c *= -1; n += 2; } printf("%.8f",ans); return 0; }

  • C言語の演算について

    次のプログラムを実行したらどう出力されますか。 微妙な代入演算の違いが分からないので、教えていただけないでしょうか。 #include<stdio.h> void main (void) { int x = 5; int y = 8; int z = 3; int a,b,c,d,e,f; a = y == x + z; b = !x; c = x + y / z; d = x *=z - 1; e = --y / --z; f = y+++ % x++; printf("%d,%d,%d,%d,%d,%d\n",a,b,c,d,e,f); } できれば途中のトレースも書いていただけると助かります。 よろしくお願いします。

  • C言語

    main() { int a = 5,b=2,e,f,g=3,i; double c,d,h=2.0; c = a/b; printf("c = %f\n",c); d = a/h; printf("d=%f\n",d); e = a++; f = ++b; g+= 4; i= ++a + b; printf(" a = %d\n",a); printf(" b = %d\n"b); printf(" e = %d\n"e); printf(" f = %d\n"f); printf(" g = %d\n"g); printf(" i = %d\n" i); 答え a=7,b=3,c=2.0,d=2.5,e=5,f=3,g=7,i=10 この問題のa,b,iがどうやってこの値になるのかがわかりません解説お願いします。

  • C言語の演算について

    次のプログラムを実行したらどう出力されますか。 微妙な代入演算の違いが分からないので、教えていただけないでしょうか。 #include<stdio.h> void main (void) { int x = 5; int y = 8; int z = 3; int a,b,c,d,e,f; a = y == x + z; b = !x; c = x + y / z; d = x *=z - 1; e = --y / --z; f = y++ % x++; printf("%d,%d,%d,%d,%d,%d\n",a,b,c,d,e,f); } できれば途中のトレースも書いていただけると助かります。 よろしくお願いします。 なお、先ほど記述ミスがあるのにも関わらず投稿してしまいました…。 正しい記述はこちらの質問です。 大変失礼しました。 前の質問は削除可能になり次第、削除いたします。

  • C言語の配列の使い方について質問です。

    以下のプログラムを配列を使って見やすくしたいのですが、どのように作ったら良いでしょうか? 宜しくお願いします。 #include<stdio.h> int main(void) { int a, b, c, d, e, f, g, h, i, j, k, l, m ,n, o; /*5段目の処理*/ for(a = 1; a <= 15; a++) { for(b = 1; b <= 15; b++) { if(a == b) continue; for(c = 1; c <= 15; c++) { if(a == c || b == c) continue; for(d = 1; d <= 15; d++) { if(a == d || b == d || c == d) continue; for(e = 1; e <= 15; e++) { if(a == e || b == e || c == e || d == e) continue; // printf("%d %d %d %d %d\n", a, b, c, d, e); ////4段目//// if(a>b){ f=a-b; } else if(a<b){ f=b-a; } if(b>c){ g=b-c; } else if(b<c){ g=c-b; } if(c>d){ h=c-d; } else if(c<d){ h=d-c; } if(d>e){ i=d-e; } else if(e<d){ i=e-d; } // printf(" %d %d %d %d \n", f, g, h, i); /////3段目//// if(f>g){ j=f-g; } else if(f<g){ j=g-f; } if(g>h){ k=g-h; } else if(g<h){ k=h-g; } if(h>i){ l=h-i; } else if(h<i){ l=i-h; } // printf(" %d %d %d \n", j, k, l); /////2段目//// if(j>k){ m=j-k; } else if(j<k){ m=k-j; } if(k>l){ n=k-l; } else if(k<l){ n=l-k; } // printf(" %d %d \n", m, n); /////三段目///// if(m>n){ o=m-n; } else if(m<n){ o=n-m; } // printf(" %d \n", o); if(a != b != c != d != e != f != g != h != i != j != k != l != m != n != o){ printf("%d %d %d %d %d\n", a, b, c, d, e); printf(" %d %d %d %d \n", f, g, h, i); printf(" %d %d %d \n", j, k, l); printf(" %d %d \n", m, n); printf(" %d \n", o); } } } } } } }

  • C言語をお願いします

    普通には出来たのですが、配列や関数の使い方がよく分かりません。 助けてください。よろしくお願いします。 問 1~30の整数の範囲で、3辺a, b, c(cを斜辺)の三角形のうち、直角三角形が成立する場合を見つけて配列に入れる。その後、配列をもとにプログラムを作成。 ※a, b, c辺を見つけて配列に入れる機能は関数にすること。 ※a <= b、b <= cを仮定。 #include<stdio.h> int myfunc(int x, int y, int z); int main(){ int a, b, c; for(a=1; a<=30; a++){ for(b=a; b<=30; b++){ for(c=b; c<=30; c++){ if(a*a + b*b == c*c){ printf("%d,%d,%d",a,b,c); puts(" "); } } } } return 0; } 実行例 3,4,5 5,12,13 ・ ・ よろしくお願いします。

  • C言語について

    C言語でif文の条件指定の際、a > b && c > dとe > f && g > hのどちらかが成立すれば真という条件を書きたい場合、a > b && c > d || e > f && g > hという文では間違いですよね? どのように表記すればいいでしょうか? 解答よろしくお願いします。

  • c言語について

    このプログラムであと2行削れるとこがあるそうです。 どこがけずれますか? #include <stdio.h> #include <math.h> #define f(x) ((x)+(log(x))) #define EPS 1e-8 main( ) { double a, b, c, fa, fb, fc; int i=1; printf("input a and b: "); /*区間[a,b]の入力, a<b とする*/ scanf("%lf%lf", &a, &b); fa = f(a); fb = f(b); do { c = (a+b) / 2; /*cの値の更新*/ fc = f(c); printf(" %2d : a = %f, b = %f, c = %f, fc = %f\n", i, a, b, c, fc); if (fb*fc < 0){ a = c; fa = fc; } if (fa*fc < 0) { b = c; fb = fc; } if(fabs(fc) < EPS ) break; }while(++i<100); /*iが100以上になったら繰り返し終了*/ }

  • C言語のプログラムで質問です。

    C言語のプログラムで質問です。 下のプログラム(最小二乗法の計算)を実行したところ -1.#IND00 というエラーが出てしまいます。 どこを直せばいいのでしょうか、教えてください。 #include <stdio.h> #include <math.h> /* gauss33.c */ #define N 3 main(){ double A[N][N],Aa[N][N]; double b[N],x[N], bb[N], e[N]; int n=N; int i, j, k; double akk, aik, s; double y[N]; double xx,yy; for(i=0;i<n;i++){ /*変数の初期化*/ x[i]=y[i]=0; for(j=0;j<n;j++) A[i][j]=0; } for(i=0;i<5;i++){ /*データ点は5点*/ printf("\n(x,y)="); scanf("%lf,%lf",&xx,&yy); A[0][0]+=xx*xx*xx*xx; /*Σx^4*/ A[0][1]+=xx*xx*xx; /*Σx^3*/ A[0][2]+=xx*xx; /*Σx^2*/ A[0][1]=A[1][0]; A[0][2]=A[1][1]=A[2][0]; A[1][2]+=xx; /*Σx*/ A[1][2]=A[2][1]; A[2][2]=n; y[0]+=xx*xx*yy; /*Σx^2y*/ y[1]+=xx*yy; /*Σxy*/ y[2]+=yy; /*Σy*/ } /* save original coefficients */ for(i=0; i<n; i++){ for(j=0; j<n; j++){ Aa[i][j]=A[i][j]; } bb[i]=b[i]; } /* forward operation */ for(k=0; k<n-1; k++){ akk=1/A[k][k]; for (i=k+1; i<n; i++){ aik=-A[i][k]*akk; for (j=k+1; j<n; j++){ A[i][j]+=aik*A[k][j]; } b[i]+=aik*b[k]; } for(j=k+1; j<n; j++){ A[k][j]*=akk; } b[k]*=akk; } /* backward operation */ x[n-1]=b[n-1]/A[n-1][n-1]; for(k=n-2; k>=0; k--){ s=0.0; for (j=k+1; j<n; j++){ s+=A[k][j]*x[j]; } x[k]=b[k]-s; } /* chek */ for(i=0; i<n; i++){ s=0.0; for(j=0; j<n; j++){ s+=Aa[i][j]*x[j];} e[i]=s-bb[i]; printf("\nx(%d)=%f error=%f\n",i, x[i], e[i]); } }

  • 円周率を求めるC言語のプログラム

    int a=10000,b,c=8400,d,e,f[8401],g;main(){for(;b-c;)f[b++]=a/5;for(;d=0,g=c*2;c-=14,printf("%.4d",e+d/a),e=d%a)for(b=c;d+=f[b]*a,f[b]=d%--g,d/=g--,--b;d*=b); というのが本(「π魅惑の数」)に載っていたので #include <stdio.h> int main(void){ int a=10000,b,c=8400,d,e,f[8401],g; for(;b-c;)f[b++]=a/5; for(;d=0,g=c*2;c-=14,printf("%.4d",e+d/a),e=d%a) for(b=c;d+=f[b]*a,f[b]=d%--g,d/=g--,--b;d*=b); return 0; } としたのですが 円周率を表示してくれません。 (b=0にすると一応は出てくるのですが微妙に間違ってます(よく分からないですけどそのくらいの誤差のあるプログラムなのでしょうか?))

専門家に質問してみよう