while文が抜けてくれない

このQ&Aのポイント
  • 質問文中のwhile文が抜けてくれない状況を解決する方法について教えてください。
  • 質問文にあるwhile文から抜けるために、send()の前にprintf文を挿入したところ、予想と異なる結果になりました。なぜですか?
  • SendSizeがTotalSize倍の値になると、while文は抜けるべきですが、実際には抜けません。この問題を解決するためにはどうすればよいでしょうか?
回答を見る
  • ベストアンサー

while文が抜けてくれない

Strは構造体。sizeof(Str)の値は106 TotalSizeはvector<Str> SendLogでのSendLog.size() SendSizeは送信バイト数 while( SendSize < TotalSize*sizeof(Str) ) { ----SendSizeBuf = send(); ----if( SendSizeBuf > 0 ) --------SendSize += SendSizeBuf; ----else --------Log.Flag = 0; } このようなwhile文があった時、 printf( "%d,%d\n",SendSize, TotalSize*sizeof(Str) ); をsend()の前に入れると 106,106 という数値が現れるのにwhile文から抜けることがありません。 どうしてなのでしょうか

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

  • ベストアンサー
回答No.1

106,106の時にSendSizeBufが0以下になっていませんか? その場合106,106 → 106,106 → 106,106...と無限ループになる論理だと思いますが・・

Null0lluN
質問者

お礼

そこを見落としていました。 ありがとうございます。

関連するQ&A

  • while文とif文

    #include <stdio.h> void main() { char str[2][6] = {"hello","lop"}; int i = 0; while(i < 2){ printf("%s\n", str[i++]); } } 上のプログラムの条件判定の部分にif文を つかうとhelloという文字列しか出力されず while文を使うとhelloとlop 二つ出力され ます。上の条件判定のif文にした時ととwhile 文にした時の違いはどこなのでしょうか?? どなたかご教授よろしくお願いしますm(_ _)m

  • do while文の条件

    do while文の条件にprintfを使う場合、これはありなんでしょうか? 内容:0が入力されていたら、whileのprintfを実行してからdoに戻る。0以外ならprintfを実行しないで処理を抜ける。 int i; do { printf("0以外の数字を入力してください。\n"); scanf("%d",&i); }while(i == 0 && printf("まじめに入力してください。\n"));

  • VC++2008Enterpriseでwinsockを扱っていいるので

    VC++2008Enterpriseでwinsockを扱っていいるのですが、 クライアント側(PC)からファイルを読み込んで、ソケットを使って、サーバー側に渡し、何もせず、そのままクライアントに返したものをprintfすると。ファイルの後ろに大量のゴミがくっついて、それの除去ができないのです。 サーバー側では普通に出力できるのですが、何でクライアント側だけ汚いか、よくわからないんです。 送ったファイルはテキストファイルで中身は aaa bbb 111 とこんな感じです。 クライアントのソースは、受信部分を抜粋しますと //ファイルを1行づつ読み込む while((fgets(buffer1, size, fp))!=NULL){ len = strlen(buffer1); sprintf(str,"%4d%s",len,buffer1); //printf("%d行目:バイト数=%s\n%s\n",n,str,buffer1); ok = send(s, str, (int)strlen(str), 0); if(ok==SOCKET_ERROR){ printf("送信できません\n"); exit(1); }else if(ok ==-1){ perror("send"); break; } n++; } shutdown(s,1); while(1){ ok = recv(s, recv_buf, sizeof(recv_buf),0); if(ok == -1) { printf("受信エラー\n"); shutdown(s,2); closesocket(s); break; }else if(ok ==0){ printf("送信終了\n"); shutdown(s,2); closesocket(s); break; }else { printf("%s\n",recv_buf); } } } } これで、出力すると大量のゴミがつくんです。 どなたか、ご指導願い無いでしょうか?

  • n^kのwhile文のプログラムについて

    下のプログラムを実行すると無限に計算されるのはなぜですかどこがおかしいか教えてください /* while1.c---for bun* n no jou*/ main() { int n,k,m,i; printf("Input n\n"); scanf("%D",&n"); printf("Input k\n"); scanf("%d",&k"); m=1; while (i<=5) { m=m*n; printf("%d no %d jou =%D\n",n,i,m); i++; } } あとこれをdo while文にするにはどうすればいいんですか

  • while文でつまづいています

    C言語はじめたばかりのものです。 単細胞生物が翌日(2日目)には分裂して2細胞になるとする。1匹もしなないとすると 1万匹を超えるのは何日目になるかを算出するプログラムを作成しています。 「15日目に16384個の細胞数になります。」という結果を出したいのですが、 「1日目に1個の細胞数になります。」と表示され、1日目までしか計算されません。 まだscanfやiprintf、ifやwhileぐらいしか習っていません。 どう直したらよいでしょうか? #include<stdio.h> #include<math.h> main() { int n; /*細胞数*/ int d = 1; /*日数*/ while(n > 10000) { n = pow(2,d-1); d = d + 1; if(n > 10000) break; } printf("%d日目に%d個の細胞数になります。",d,n); }  

  • C言語のwhile文を使った素数判定プログラムで…

    次に示すプログラムは、100までの素数を表示するものです。 見てのとおり、C言語のwhile文を使って書いてあります。 #include <stdio.h> int main(void) { int a, b; int flag = 0; a = 2; b = 2; while(b <= 100){ *ここ* while(a < b){ if(b%a == 0){ flag = 0; break; } else{ flag = 1; } a++; } if(flag == 1){ printf("%dは素数\n", b); } b++; } getch(); return 0; } 最初、手本を参考にしながら上記のように書きましたが、うまく機能せず、3から100までの数字すべてが素数であると表示されました。 どこが間違っているのかと、手本と厳密に見比べてみたら、8行目の a = 2 が*ここ*と書いてある場所に書かれていました。 まさかないだろうと思いつつ、もとあったのを消して*ここ*に書き換えたら、正しく素数が表示されるようになりました。 値を代入する場所が違うだけで、なぜこのような違いが起こるのか全く理解できません。 教えてください。 (一応、書いておきますが使っているコンパイラはBorlandのやつです コンパイラのせいってことはないですよね)

  • while文の条件

    参考書でC言語を勉強しておりますが、タイトルの件で分からないことがあります。 #include <stdio.h> #include <string.h> void main(void) { char *p = "stop"; char str[80]; do { printf("文字列を入力してください:"); gets(str); }while(strcmp(p , str)); } while文は条件が真(0でない)の場合に繰り返し、偽(0)の場合に抜けるという認識なんですが、上記のwhile文だと、strcmp()の戻り値が0の場合(偽)に繰り返しを抜けます。 なぜなのか分かりません。 どなたか教えてください。

  • while文の条件

    参考書でC言語を勉強しておりますが、タイトルの件で分からないことがあります。 #include <stdio.h> #include <string.h> void main(void) { char *p = "stop"; char str[80]; do { printf("文字列を入力してください:"); gets(str); }while(strcmp(p , str)); } while文は条件が真(0でない)の場合に繰り返し、偽(0)の場合に抜けるという認識なんですが、上記のwhile文だと、strcmp()の戻り値が0の場合(偽)に繰り返しを抜けます。 なぜなのか分かりません。 どなたか教えてください。

  • while文の判定について(C言語)

    while文の判定についてです たぶんすごいつまらないミスなので時間の余っている方 ご指導ください<_ _> (自分ではいろいろ調べましたが原因がわかりません><、) returnやbreakを使わないで二分探索を終了させよとの問題で low-highで2ならばデータが見つかったとき 1ならば見つからなかったときという判定で whileで抜けさせたいのですがどうしても抜けません><、 論理演算子の使い方が間違っているのでしょうか? #include<stdio.h> #define N 10 int main(void) { static int a[]={2,3,4,11,31,50,55,70,77,80}; int key,low,high,mid; high=N-1; low=0; int i=0; printf("検索するdata ? :");scanf("%d",&key); ここです while((2!=(low-high)) || (1!=(low-high))){ mid=(low+high)/2; if(a[mid]==key){ low=mid+1; high=mid-1; } else if(a[mid]<key){ low=mid+1; } else{ high=mid-1; } } if(2==(low-high)){ printf("%2dは%2d番目にありました",key,mid); } else{ printf( "見つかりませんでした" ); } return 0; } while内でlow-highをprintfで出力しましたが2と1が出力されました

  • if文で…

    いつもお世話になっております。 ------------------------ typedef struct douken_ { char tiku[11]; char ken[9]; } douken; int main(void){ FILE *fp; douken dou [100]; char buff [18 /* douken */ + 2 /* CrLf(\n\r) */ + 1 /* \0 */]; int i; i = 0; fp = fopen("ex3.fil","rb"); if ( fp == 0 ){ printf("can't open\n"); exit(1); } memset (dou , '\0' , sizeof dou); memset (buff, '\0' , sizeof buff); 問題はここから----------------- while (fgets(buff,sizeof buff,fp) != NULL){ memcpy(&dou[i].tiku ,buff,10); memcpy(&dou[i].ken ,buff+10,10); if (&dou[i].tiku == &dou[i-1].tiku){ printf("%s %s",&dou[i-1].tiku,&dou[i].tiku,&dou[i].ken);} else{ printf("-----------------------"); } ------------------------ 上記のプログラムでは ファイルから読み込んだデータを 構造体に格納して if文で現データと全データを 比較するという処理をしています。(つもり) 構造体に格納するところまでは 出来たのですが if文のところが上手く行きません。 例えば 現データ(tiku)関東地区 前データ(tiku)関東地区 と、同じ場合は 関東地区 東京 と、表示したいのに ----------- と、elseの処理をしてしまいます。 対処方法をご存じでしたら、 ご教授して頂けたら幸いです。

専門家に質問してみよう