• ベストアンサー

プログラムの間違っている箇所が分かりません

文字列の置換プログラムを作りたいのですが、下記のプログラムでは正常に動きませんでした。 例えば、「call」の「ll」を「sell」と変換しようとするとエラーがでてしまいます。 プログラミング初心者なので、どこが間違っているのかよく分からないです。 以下、問題のあるプログラムを記述します。 #include <stdio.h> void change(char *in, char *bef, char *af){     char tmp[100];     int i = 0, j = 0;     int flg=0;         for(i = 0; *(af + i) != '\0'; i++){         tmp[i] = *(af + i);     }     tmp[i] = '\0';     for(j = 0; *(in + j) != '\0'; j++){     if(flg == 0 && *(bef + j) == '\0'){             flg = 1;     }         if(flg == 1){             tmp[i++] = *(in + j);             tmp[i] = '\0';         }     }     for(j = 0; j<=i; j++){         *(in + j) = tmp[j];     } } int check(char *in, char *bef){       int i=0;     int flg=0;     while(*(bef+i)!='\0'){             if(*(in+i)=='\0' || *(in+i)!=*(bef+i)){             flg=1;             break;         }         i++;     }     return flg; } int main(){     char in[100];     char bef_ch[20];     char af_ch[20];     int i=0;     printf("文字列を入力して下さい。\n");     gets(in);     printf("置換したい文字列を入力して下さい。\n");     gets(bef_ch);     printf("置換後の文字列を入力して下さい。\n");     gets(af_ch);     while(in[i]!='\0'){         if(check(&in[i], &bef_ch[0]) == 0){             change(&in[i], &bef_ch[0], &af_ch[0]);         }         i++;     }     printf("置換結果を示します。\n");     printf("%s\n",in);     return 0; }

質問者が選んだベストアンサー

  • ベストアンサー
  • wadachi5
  • ベストアンサー率100% (2/2)
回答No.4

こんにちは 回答としましては、以下私なりに改良したソースを挙げておきます。 ---改良したソース---(//コメントのある行) #include <stdio.h> int change(char *in, char *bef, char *af){ //文字列長さを返すようにした char tmp[100]; int i = 0, j = 0; int flg=0; int aflength = 0; //afの文字列長さ for(i = 0; *(af + i) != '\0'; i++){ tmp[i] = *(af + i); } tmp[i] = '\0'; aflength = i; for(j = 0; *(in + j) != '\0'; j++){ if(flg == 0 && *(bef + j) == '\0'){ flg = 1; } if(flg == 1){ tmp[i++] = *(in + j); tmp[i] = '\0'; } } for(j = 0; j<=i; j++){ *(in + j) = tmp[j]; } return aflength; //置き換えられたafの文字長を返す } int check(char *in, char *bef){ int i=0; int flg=0; while(*(bef+i)!='\0'){ if(*(in+i)=='\0' || *(in+i)!=*(bef+i)){ flg=1; break; } i++; } return flg; } int main(){ char in[100]; char bef_ch[20]; char af_ch[20]; int i=0; printf("文字列を入力して下さい。\n"); gets(in); printf("置換したい文字列を入力して下さい。\n"); gets(bef_ch); printf("置換後の文字列を入力して下さい。\n"); gets(af_ch); while(in[i]!='\0'){ if(check(&in[i], &bef_ch[0]) == 0){ i += change(&in[i], &bef_ch[0], &af_ch[0]); //置き換えられた分だけポインタを進める } else { ++i; } } printf("置換結果を示します。\n"); printf("%s\n",in); return 0; } ーーーーー以上 原因としては、メインルーチンで「call」の「ll」を「sell」に置き換え後の処理がなされていないため永久ループに入ってしまうため発生していました。 1)call 2)casell←ここでllがsellに置き換えられる 3)casesell←さらにsell自身のllをsellで置きかえる「 4)casesesell←さらにsell自身のllをsellで置きかえる 5)・・・・・・・←同上の繰り返し これを避けるため置き換え後は、置き換え文字分でポインタを進める事にしました。 以下、追伸 なお、質問にある使い方「例えば、「call」の「ll」を「sell」と変換しようとすると」とある部分は、下記の様に質問されると回答者が理解しやすく、早々な回答を得られる可能性が高まります。 (以下、本件の質問例) ■プログラムを実行後、下記の様な操作を行うとエラーが発生してしまいます。 文字列を入力して下さい。 call[enter] 置換したい文字列を入力して下さい。 ll[enter] 置換後の文字列を入力して下さい。 sell[enter]←直後にエラーが発生 ■期待する動作としては、下記の通りです。 文字列を入力して下さい。 call 置換したい文字列を入力して下さい。 ll 置換後の文字列を入力して下さい。 sell 置換結果を示します。 casell

noname#61783
質問者

お礼

回答ありがとうございます。 とても分かりやすく、良く理解できました。 書き方のアドバイスもわざわざ書いて下さって、ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

noname#62605
noname#62605
回答No.3

続きです。 break;の意味をよーく考えてみてください。

全文を見る
すると、全ての回答が全文表示されます。
noname#62605
noname#62605
回答No.2

ちょっと質問の内容が理解できないので、整理して補足要求をお願いします。 >「call」の「ll」を「sell」と変換しようとするとエラーがでてしまいます。 →この文章の表現だと「ll」は変換されていないですよね??  たとえば「call」の「ll」以外を置き換えて「sell」にするとか  「call」を「sell」に置き換えるか(全部置き換え)によってプログラミングの仕方(元をたどると仕様)が変わってくると思います。  さらに踏み込めば「all」と入力した場合はどういう結果を求めたいのか。 ポイントとしては文字列を入力してください→置換したい文字列を入力してください→置換後の文字列を入力するステップが正しいかどうか。 check()およびchange()のパラメータの渡し方が正しいか。中の処理が正しいか。 change()関数で処理が行われますか?? これをチェックすれば大丈夫だと思います。

noname#61783
質問者

補足

回答ありがとうございます。 もう一度関数の中の処理が正しいか確認してみます。 求めたい結果については、 文字列を入力して下さい。 aabbcc 置換したい文字列を入力して下さい。 bb 置換後の文字列を入力して下さい。 ebb 置換結果を示します。 aaebbcc という結果を求めていますが、置換結果を表示する部分でエラーが出ます。

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

なんか毎度書いてるような気がするんですが, ・どのような入力に対してどのような出力を期待したところ ・実際にはどのような結果となったのか くらいは書いてもいいんじゃないかなぁ.

noname#61783
質問者

補足

言葉足りずですいません。 文字列を入力して下さい。 aabbcc 置換したい文字列を入力して下さい。 bb 置換後の文字列を入力して下さい。 ebb と入力するとエラーが出るということです。 この場合の求めたい結果はaaebbccで、bbがebbと入れ替われば成功です。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ラベリング処理プログラム

    画像のラベリング処理プログラムを作っているんですが どうもうまく実行できません。よければ教えていただけないでしょうか。 #include<stdio.h> #include<stdlib.h> int column, row; unsigned char val[4] = {0,0,0,0}; unsigned char tmp[255]; int pos_y[4] = {-1, 0, 1, 0}; int pos_x[4] = {0, 1, 0, -1}; int i, j, x, y, label, level, label1; int label_count = 1; unsigned char *in, *out; void labeling_main(); void labeling_search(); void labeling_main() { for(i = 0; i < y; i++){ for(j = 0; j < x; j++){ printf("aaa\n"); if(out[i * x + j] == 255){ printf("bbb\n"); fflush(stdout); out[i * x + j] = label_count; labeling_search(label_count, i, j); label_count++; } } } } void labeling_search(int label_count, int x, int y) { for(i = 0; i < 4; i++){ if(out[(pos_y[i] + y) * x + (pos_x[i] + x)] == 255){ out[(pos_y[i] + y) * x + (pos_x[i] + x)] = label_count; labeling_search(label_count,(pos_y[i]+y),(pos_x[i]+x)); } } printf("ccc\n"); } int main(int argc, char *argv[]) { int result; int head, Magic; unsigned char *image, *in, *out, *res, *ros; FILE *fin, *fout; if(argc!=3){ printf("Usage : %s input output\n",argv[0]); exit(1); } fin = fopen(argv[1],"rb"); /* -------------------- ヘッダ取得ここから -------------------- */ fgets(tmp,255,fin); if(tmp[0]!='P') return 0; sscanf(tmp,"P%d",&Magic); if(Magic < 1 || Magic > 6) return 0; do fgets(tmp,255,fin); while(tmp[0]=='#'); sscanf(tmp,"%d %d",&x,&y); if(x < 1 || y < 1) return 0; fgets(tmp,255,fin); sscanf(tmp,"%d",&level); /* ヘッダの確認 */ printf("P%d\n",Magic); printf("%d %d\n",x,y); printf("%d\n",level); /* 画素の読み込み */ in = (unsigned char *)malloc(sizeof(unsigned char) *x*y); fread(in,sizeof(unsigned char),x*y,fin); fout = fopen(argv[2],"wb"); fprintf(fout,"P%d\n",Magic); fprintf(fout,"# My new PGM\n"); fprintf(fout,"%d %d\n",x, y); fprintf(fout,"%d\n",level); fwrite(out, sizeof(unsigned char),x*y, fout); out = (unsigned char *)malloc(sizeof(unsigned char) *x*y); //2値画像 for (i = 0; i < y; i++) { for (j = 0; j < x; j++){ if(in[i * x + j] > 120){ out[i * x + j] = 0; }else if(in[i * x + j] <= 120){ out[i * x + j] = 255; } } } labeling_main(); printf("Max label number:%d\n",label_count); free(in); free(out); fclose(fin); fclose(fout); } コンパイルは通るのですが実行するとlabeling_mainの if文でセグメンテーションが出てしまいます。

  • プログラムのことで

    次のプログラムの変数の説明と処理の流れを素人でも理解できるように説明してもらえないでしょうか。 #include <stdio.h> #define MAX 128 int str_comp(char nx[], char ny[]){ int i, j, k=0; for(i=0; i<=MAX; i++){ if( nx[i]=='\0' ){ return 0; } else if( nx[i]==ny[0] ){ for( j=0; nx[i]==ny[j]; j++ ){ i++; } if( ny[j]=='\0' ){ return 1; } } } } int main(void) { char namex[MAX}; char namey[MAX}; int n; int i; printf("文字列x(64文字まで)? "); scanf("%s",namex); printf("文字列y(64文字まで)? "); scanf("%s",namey); n=str_comp(namex,namey); if(n==1){ printf("'%s'に'%s'は含まれます\n",namex,namey); } else if(n==0){ printf("'%s'に'%s'は含まれません\n",namex,namey); } return 0; } 実効結果 文字列x(64文字まで)? Katatsumuri  文字列y(64文字まで)? ta 'Katatsumuri'に'ta'は含まれます. エラーは出ないはずです。 よろしくお願いします。

  • プログラムが動きません。

    プログラムが動きません。 ファイルuniqipにはIPアドレスが書き込まれています。そのファイルからIPアドレスを文字列ipに格納します。 ファイルtmp4には、85.114.143.2 34f4ff4acb18802170a939ae42dcd5ee0eeccda4 のようにIPアドレスとハッシュ値が書き込まれています。 tmp4に現れるIPアドレスで、uniqipに一致するものに対応するハッシュ値を printf("file%d,%s\n",i,hash); の形で出力しようと思いましたが、うまくいきません。 何がまずいのでしょうか? #include <stdio.h> #include <string.h> //ひとつのIPアドレスに現れるユニークなハッシュ値の数をカウントする int main() { FILE *fp,*gp; char ip[269730][16]; char ip2[16]; char hash[42]; int i,j; fp = fopen("uniqip","r"); if(fp == NULL){ printf("can not open the file.\n"); return 1; } for(i=0;i<267930;i++) { fscanf(fp,"%s",ip[i]); //printf("%s\n",ip[i]); } fclose(fp); ////////////////////////////////////////////////////////////////////////////////////////////////////// gp = fopen("tmp4","r"); if(gp == NULL){ printf("can not open the file.\n"); return 1; } for(i=0;i<267930;i++){ for(j=0;j<2470766;j++){ fscanf(gp,"%s %s",ip2,hash); printf("%s\n",ip[i]); if(!strcmp(ip[i],ip2)) { printf("file%d,%s\n",i,hash); } } } return 0; }

  • プログラムの添削

    以下のような数当てゲームを作りました.なるべくうまいプログラムを書けるようになりたいのですが,どのような改善点がありますか?よろしくお願いします. /*数当てゲームを作りなさい.*/ #include<stdio.h> void maegaki(void); /*このように関数を定義しまくることに意味はあるのか?main関数はすっきりするけど.*/ void in_check_out(int i); int main(void) { int i; int j; maegaki(); for(j=0;j<10;j++) { scanf("%d",&i); in_check_out(i); if(!(i-1)) return 0; printf("残り%d回です.\n",9-j); } return 0; } void maegaki(void) { printf("数当てゲームをはじめます.\nぼくの好きな整数を当ててください.\nチャンスは10回です.\nヒントはボゾン\n"); } void in_check_out(int i) { if(!(i-1)) { printf("正解!答えは1です.\n"); } else { printf("残念!\n"); if(i>1) printf("%dより小さいです.\n",i); else printf("%dより大きいです.\n",i); } }

  • ソートプログラムの穴抜き問題がわからない!(明日試験:;)

    基数ソートプログラムの一部なんですが穴抜きでわからない部分がありまして・・。 栄小文字の文字列からなる単語データをアルファベット順に習える基数ソートなんですが、英数字が26種類あることから基数は27にしています。 *******; ↑ここの部分がわかりませんで:; #include <stdio.h> #define nmax 10000 #define length 5 int ch2int(char ch) { (略)// a~zを1~26に変換する。 } void scopy(char from[], char to[]) { int i = 0; while((to[i]=from[i])!='\0'){ i++ } } void radix_sort(char a[][length+1], int n) { int pos, order[27], i, j; char buf[nmax+1][length+1]; for(pos=length-1; pos>=0;pos--){ for(j=0;j<27;j++){ order[j]=0; } for(i=1;i<=n;i++){ *******; } for(j=1;j<27;j++){ *******; } for(i=n;i>=1;i--){ scopy(a[i], buf[order[ch2int(a[i][pos])]--]); } for(i=1; i<=n;i++){ *******; } } } int main() { int n=0;i,ch; charword[nmax+1][length+1]; printf("5文字以内で英単語を入力\n"); while(n<nmax){ i=0; while(i<length && (ch=getchar())!=EOF && ch!='\n' && ch!= ' '){ words[n+1][i++]=ch; } if(i>0){ while(i<length){ words[n+1][i++] = ' '; } words[n+1][length]='\0'; n++; } if(ch==EOF){ break; } } printf("\nソーティング前の入力データ\n"); for(i=1;i<=n;i++){ printf("words[%3d]=%s \n", i, words[i]); } radix_sort(words, n); printf("\nソーティング後のデータ\n"); for(i=1;i<=n;i++){ printf("words[%3d]=%s \n", i, words[i]); } } 長文で失礼ですが・・。どなたか教えていただければすっごい光栄です:;

  • Cプログラムで15パズルを作ってみたのですがうまく動作しません。何処が

    Cプログラムで15パズルを作ってみたのですがうまく動作しません。何処が間違っているのかずっと考えているのですがいまだに解決策が見つかりません。ヒントでもいいのでお願します。 #include <stdio.h> int init(void); void show(void); int chk_cmp(void); char input(void); int move(char cmd); #define N 4 int panel[N][N] = { { 1, 2, 3, 4}, { 5, 6, 7, 8}, { 9, 10, 11, 0}, {13, 14, 15, 12} }; int x, y; int main(void) { printf("これは15パズルです。\n" "左上から右に向かって「1」から「15」が並ぶよう,\n" "「0」を動かしてください。\n" "操作はテンキーで行います。( 8(上),4(左),6(右),2(下) )\n"); if( !init() ) { printf("パネルの初期化に失敗しました。「0」のパネルがありません。\n"); return 1; } while(1) { show(); if( chk_cmp() ) { printf("完成です!\n"); break; } while(1) { if( move(input()) ) { break; } else { printf("そっちには動かせません。\n"); } } } return 0; } int init(void) { int i,j; for(i=0;i<=N-1;i++){ for(j=0;j<=N-1;j++){ if(panel[i][j]==0){ x=j; y=i; return 1; } } } return 0; } void show(void) { int i,j; printf("---------------\n"); for(i=0;i<=N-1;i++){ for(j=0;j<=N-1;j++){ printf("%3d",panel[i][j]); } printf("\n"); } printf("---------------\n\n"); } int chk_cmp(void) { int i,j; for(i=0;i<=N-1;i++){ for(j=0;j<=N-1;j++){ if(i==N-1&&j==N-1){ if(panel[i][j]!=0){ return 0; } }else{ if(panel[i][j]!=N*i+j+1){ return 0; } } } } return 1; } char input(void) { int comand; while(1){ scanf("%d",&comand); if(comand==8||comand==4||comand==6||comand==2){ break; } printf("8(上),4(左),6(右),2(下)を入力してください。"); } return comand; } int move(char cmd) { int dx=0, dy=0; if(cmd==8){dy=-1;}//上 if(cmd==4){dx=-1;}//左 if(cmd==6){dx=1;}//右 if(cmd==2){dy=1;}//下 if(x+dx>=0&&x+dx<=N-1&&y+dy>=0&&y+dy<=N-1){ panel[y][x]==panel[y+dy][x+dx]; panel[y+dy][x+dx]==0; y+=dy; x+=dx; return 1; } else{return 0;} }

  • 途中経過も表示するプログラム

    以下のプログラムで途中経過(例えば i=3の時 44 52 22 41 81 i=2の時 44 22 41 52 81 i=1の時 22 41 44 52 81 のように途中経過を表示するにはどうしたらいいんですか? 解る方がいらっしゃいましたら教えてください。 #include <stdio.h> int main(void) { int i,j; int n; /* データ数 */ int data[100]; /* データ用 */ int tmp; /* 交換用 */ printf("データ数="); scanf("%d",&n); for(i=0;i<n;i++){ /*データ入力*/ printf("data[%d]=",i); scanf("%d",&data[i]); } for(i=n-2;i>=0; i--){ for(j=0; j<=i; j++){ if(data[j]>data[j+1]) { tmp=data[j]; /* 隣あうデータ */ data[j]=data[j+1]; /* の交換 */ data[j+1]=tmp; } } } printf("ソート結果\n"); for(i=0;i<n;i++){ printf("data[%d]=%d\n",i,data[i]); } }

  • ビット列を走査するプログラムの関数化

    char型の変数に0or1を入れて擬似的にビット列にした配列をLSBからMSBまで走査し、一致したらループを抜け終了するプログラムをCで書きたいと思っています。 他のプログラムでも使いまわし、かつ見やすくするためにこの部分を関数化したいのです。ソースにはbreakを使っているのですが、当然ながらbreakはforかwhile内で使わないとダメだと思いますが、ソース作成の都合上、for文は関数内に入れたくないのです。 (つまり、条件分岐を関数化したものをfor文内で用いたい) うまい方法が思いつかずに困っています。もし良い方法をお気づきの方がおられたらご助力下さい。 //===============================================// //=================以下ソース====================// //===============================================// //ビット配列correct_ciphertextとPbinを比較するプログラム //LSBからMSBまで順に走査を行い、違うビットが出てきた時点でbreakし、走査を止める //Pbinは固定値を与えている #include <stdio.h> #include <string.h> unsigned int mes[2]; unsigned int key[2]; char Pbin[64]; char Kbin[64]; char ciphertext[64] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0}; void ConvertPtextToBin_ForHost(unsigned int mes[]){ unsigned int tmp_mes[2] = {mes[0], mes[1]}; int i, j; for(j=0;j<=1;j++){ for(i=0;i<=31;i++){ Pbin[j*32 + 31-i] = tmp_mes[j] % 2; tmp_mes[j] = tmp_mes[j] / 2; } } } int main(int argc, char *argv[]){ //initialize mes[0] = 0x00000000; mes[1] = 0x00000000; int i, j, k; int x=0, y=0; while(1){ printf("mes[1] = %d\n", mes[1]); ConvertPtextToBin_ForHost(mes); for(i=0; i<64; i++){ printf("%d", Pbin[i]); if((i+1)%8 == 0) printf(" "); } printf("\n"); //************************* //ビット走査 //************************* for(k=0; k<64; k++){ if( (ciphertext[63-k] == Pbin[63-k]) ){ //同じビットであれば、次のビットを走査する }else{ printf("Error\n");//後ろから走査していって、1ビットでも違うものがあれば違うビット列と判断する break; } } //ここに来たら違うビット列だったということ if(k != 64){ mes[1]++; printf("Not match ciphertext... %dth bit didn't match. (0bit:LSB)\n", k); printf("This was %d*%dth Search...\n\n", y, x); x++; if(x>=65535){i=0; y++;} }else{ //k=64つまり、最後のビットまで同じビットだったということ⇒つまり、「発見」 printf("Match ciphertext\n"); printf("This was %d*%dth Search...\n\n", y, x); break; } //*********************** //ビット走査の終了 //*********************** } }

  • カレンダーのプログラム

    指定した開始月と終了月を入力して、それを横に最大3つまで並べて 納まりきらないときは改行するというプログラムを作りたいです。 イメージとしては、2009年の9月から2009年の12月まで指定した場合は… 2009 / 9              2009 / 10             2009 / 11 1 2 3 4 5 6 7          1 2 3 4 5 6 7           1 2 3 4 5 6 7 8 9 10 11 12 13 14      8 9 10 11 12 13 14       8 9 10 11 12 13 14 15 16 17 18 19 20 21    15 16 17 18 19 20 21    15 16 17 18 19 20 21 21 22 23 24 25 26 27    21 22 23 24 25 26 27    21 22 23 24 25 26 27 28 29 30           28 29 30 31           28 29 30   2009 / 12 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 21 22 23 24 25 26 27 28 29 30 31 (最初の日数などは適当ですし、ちょっとずれてしまっていますがご了承ください。あくまでもイメージなので…) ところが下のプログラムを動作させようとしたところ全く 動きません。何がおかしいために動作しないのでしょうか? よろしくお願いします。 #include<stdio.h> #include<string.h> int getyoubi(int year,int month,int day) { if(month==1 || month==2 ) { year--; month +=12; } return ((year+year/4-year/100+year/400+(13*month+8)/5 + day)%7); } int main(void) { int nen1,tuki1,nen2,tuki2,tukiho,nenho,tukih,w,i,j; char sbuf[3][7][22]; int tuki[12]={31,28,31,30,31,30,31,31,30,31,30,31}; int k; char tmp[4]; printf("カレンダーを表示します。\n"); printf("開始年月を入力せよ。\n"); printf("年:"); scanf("%d",&nen1); printf("月:"); scanf("%d",&tuki1); printf("終了年月を入力せよ。\n"); printf("年:"); scanf("%d",&nen2); printf("月:"); scanf("%d",&tuki2); do{ /*3つのカレンダー分の格納する*/ for(i=0;i<3;i++) { w=getyoubi(nen1,tuki1,1); sprintf(sbuf[i][0],"%10d /%3d ",nen1,tuki1); for(k=1;j<7;k++) { sbuf[i][k][0]='\0'; } sprintf(sbuf[i][1],"%*s",3*w,""); k=1; for(j=1;j<tuki[tuki1];j++) { sprintf(tmp,"%3d",j); strcat(sbuf[i][k],tmp); if(j%7==6) { k++; } } do{ if(j%7==6) { sprintf(sbuf[i][k],"%21s",""); } else { do{ strcat(sbuf[i][k]," "); j++; }while(j%7!=6); k++; } }while(k!=7); tuki1++; if(tuki1==13) { tuki1=1; nen1++; } if(nen1>nen2 || nen1==nen2 && tuki1>tuki2) { break; } } /*3つためたカレンダーを出力する。*/ for(i=0;i<3;i++) { printf("%s",sbuf[i][0]); } printf("\n"); for(i=0;i<3;i++) { printf(" 日 月 火 水 木 金 土 "); } printf("\n"); for(i=0;i<3;i++) { printf("----------------------"); } printf("\n"); for(i=1;i<7;i++) { for(j=0;j<3;j++) { printf("%s",sbuf[j][i]); } } /*指定した年の月になるまでループ*/ }while(nen1<nen2 || nen1==nen2 && tuki1<=tuki2); return 0; }

  • プログラム(初心者)

    文字列を入力し中に含まれる空白を削除した文字列を作るプログラムなのですが #include <stdio.h> #include <stdlib.h> int main(void){ char str[100]; int i,j,c; printf("文字列を入力してください\n"); gets(str); i=j=0; do{ c=str[i++]; if(c!= ' ') str[j++]=c; }while(c); printf("空白を削除した文字列は%sです\n",str); return EXIT_SUCCESS; } do文の所何やってるかさっぱりわかりません 教えてください