No.17354![]() |
改行を押すと「error!!」出し、プログラムを終了させる処理 投稿者---レイ(2004/10/17 21:30:06) |
||
はじめまして。ちょいとC言語を齧っている者です。 質問なのですが、ちょっとした問題のプログラムを作成中、改行(エンター)を押した際に「error!!」という文字を表示させてプログラムを終わらせたいのですが、どうにも上手くいきません。 int型配列変数に初期値を持たせても上手くいきませんでした。 下にプログラムを表示します。 #include <stdio.h> main() { int a; int str[3]; str[0] = -1; str[1] = -1; str[2] = -1; for (a=0; a<3; a++){ printf("str[%d]:", a); scanf("%d", &str[a]); if (str[a] == -1){ printf("error!!\n"); break; } while (str[a]>100000000){ str[a] = str[a]/10; } if (str[a]<0){ printf("error!!\n"); break; } } if (str[2]>=0){ printf("3つの整数和は%d\n", str[0]+str[1]+str[2]); } return(0); } どうすればエンターを押した際に「error!!」を出して終了させることが出来るでしょうか? 誰かご教授いただけるとありがたいです。 |
No.17355![]() |
Re:改行を押すと「error!!」出し、プログラムを終了させる処理 投稿者---五男(2004/10/17 21:35:00) |
||
またまたかなり初心者のコードですねw 私も初心者なので頑張りますw |
No.17356![]() |
Re:改行を押すと「error!!」出し、プログラムを終了させる処理 投稿者---やすこ(2004/10/17 22:22:33) |
||
あなたのプログラムをちょっといじるとこんな感じになるのでは #include <stdio.h> #include <string.h> #include <stdlib.h> main() { int a; int str[3]; char buf[50]; for (a=0; a<3; a++){ printf("str[%d]:", a); fgets(buf,50,stdin); if(strcmp(buf,"\n")==0){ printf("error!!\n"); return 1; } str[a]=atoi(buf); while (str[a]>100000000){ str[a] = str[a]/10; } if (str[a]<0){ printf("error!!\n"); return 1; } } if (str[2]>=0){ printf("3つの整数和は%d\n", str[0]+str[1]+str[2]); } return(0); } |
No.17359![]() |
Re:改行を押すと「error!!」出し、プログラムを終了させる処理 投稿者---レイ(2004/10/18 02:41:30) |
||
やすこさん、ご教授の程ありがとうございました。 #include <stdlib.h> を使うことになるとは……。 もっと勉強してきます。 |
No.17394![]() |
Re:改行を押すと「error!!」出し、プログラムを終了させる処理 投稿者---レイ(2004/10/19 11:51:10) |
||
あれから多少変更したのですが、今度はstr[1]が2桁以上の数、str[2]が3桁以上の数でなければ「error!!」と出てしまうようになりました。 (str[1]が1、str[2]が23などで何故か終了してしまう) 下にプログラムを載せます。 #include <stdio.h> #include <string.h> #include <stdlib.h> main() { int a; int str[3]; char buf[50]; for (a=0; a<3; a++){ /*a=0とし、aが3を超えるまで処理をする*/ printf("str[%d]:", a); fgets(buf,50,stdin); if( strcmp(buf,"\n") == 0){ /*bufに改行を入力した場合、1行下のprintfに進む*/ printf("error!!\n"); return 1; } if ('0' > buf[a] || '9' < buf[a]){ /*bufに0よりも小さい、もしくは9よりも大きい文字コードが入力された場合、下のprintfに進む*/ printf("error!!\n"); return 1; } str[a]=atoi(buf); while (str[a]>100000000){ /*str[a]が9桁以上の場合、10で割る*/ str[a] = str[a]/10; } if (str[a]<0){ /*str[a]が負の数の場合、1行下のprintfに進む*/ printf("error!!\n"); return 1; } } if (str[2]>=0){ /*str[2]が0以上の場合、1行下のprintfに進む*/ printf("3つの整数和は%d\n", str[0]+str[1]+str[2]); } return(0); } どうやったらstr[1]、str[2]が一桁でもプログラムが進む(残る)ようになるでしょうか? どなたかご教授のほどお願いいたします。 |
No.17395![]() |
Re:改行を押すと「error!!」出し、プログラムを終了させる処理 投稿者---επιστημη(2004/10/19 12:27:03) |
||
>あれから多少変更したのですが、今度はstr[1]が2桁以上の数、str[2]が3桁以上の数でなければ「error!!」と出てしまうようになりました。 単に error!! と書くんじゃなくて、 error-1 とか error-2 とかメッセージを変え、どこで抜け出してるか調べるのが先決。 |
No.17403![]() |
Re:改行を押すと「error!!」出し、プログラムを終了させる処理 投稿者---ホワイト(2004/10/19 13:17:52) |
||
if ('0' > buf[a] || '9' < buf[a]){ printf("error!!\n"); return 1; } ここの部分をもう一度よく考えてみてください。 |
No.17404![]() |
Re:改行を押すと「error!!」出し、プログラムを終了させる処理 投稿者---ken(2004/10/19 13:27:49) |
||
ここがおかしい if ('0' > buf[a] || '9' < buf[a]) これではbuf[a]に入ってる1文字しかチェックしてないことになります a = 1 の時に1桁しか入力されてなかったりしたらエラーになりますよ 他にも方法があるかもしれませんが、この場合、 文字列の最初から最後までisdigit()で1文字ずつチェック するのがわかりやすいでしょう |
No.17417![]() |
Re:改行を押すと「error!!」出し、プログラムを終了させる処理 投稿者---レイ(2004/10/20 00:51:49) |
||
色々考えたのですがどうにも上手く作成できません。 どなたか教えてはいただけないでしょうか……。 |
No.17418![]() |
Re:改行を押すと「error!!」出し、プログラムを終了させる処理 投稿者---かずま(2004/10/20 02:45:54) |
||
#include <stdio.h> int main(void) { int i; int str[3]; char buf[256]; for (i = 0; i < 3; i++) { printf("str[%d]:", i); if (fgets(buf, sizeof buf, stdin) == NULL || sscanf(buf, "%d", &str[i]) != 1 || str[i] < 0) { printf("error!!\n"); return 1; } while (str[i] > 100000000) str[i] /= 10; } printf("3つの整数和は %d\n", str[0] + str[1] + str[2]); return 0; } |