C言語関係掲示板

過去ログ

No.386.scanfからの判別文

[戻る] [ホームページ]
No.2616

scanfからの判別文
投稿者---あきさ(2002/09/05 23:03:59)


 下のソースは、最初の入力で足し算か引き算または終了を決め、一回目・二回目の値を元に計算するものですが、scanfで1とスペースを5回、さらに5と入力すると「1     5」と表示されたまま計算されてしまいます。
自分としては、「1     5」と入力された後にこれをはじくエラー文を書きたいのですが、うまくif文等が思いつきません。なにか良い方法があったらおしえてください。
よろしくお願いします。   



#include &lt stdio.h &gt
#include &lt string.h &gt

/*足す関数*/
void tasu(int x,int y,int *t){
*t = x + y;
}

/*引く関数*/
void hiku(int x,int y,int *t){
*t = x - y;
}
main(void)
{
int a = 0;
int b = 0:
char x;
char no[10000];
int i = 1;
int h = 1;
int sum = 0;
int t = 0;
memset(no,0x00,sizeof(no));
while(1){
printf("処理の値は?\n");
scanf("%s",&no);
while(1){ /*scanfで多く入力された場合それとりこむための文*/
x = getchar();
if(x==0x0a){
break;
}

if(strcmp(no,"e") ==0 || strcmp(no,"99") ==0){
printf("処理を終了します\n");
break;
}
if(!(strcmp(no,"1") ==0 || strcmp(no,"2") ==0)){
printf("再度入力してください\n");
continue;
}

a = 0;
if(strcmp(no,"1") ==0){
printf("1回目の値は?\n"); scanf("%d",&a);
getchar();
printf("2回目の値は?\n"); scanf("%d",&b);
getchar();
tasu(a,b,&t);
printf("1回目と2回目の値を足すと%d\n",t);
printf("%d回目の足し算です\n,i);
i++;
}else if(strcmp(no,"2") ==0){
printf("1回目の値\n"); scanf("%d",&a);
getchar();
printf("2回目の値\n"); scanf("%d",&b);
getchar();
hiku(a,b,&t);
printf("一回目から二回目を引くと%d\n",t);
printf("%d回目の引き算です。\n",h);
}else{
printf("入力された値が違います再度入力してください。\n");
}
}
}

No.2617

Re:scanfからの判別文
投稿者---かずま(2002/09/06 02:17:05)


> scanfで1とスペースを5回、さらに5と入力すると「1     5」と
> 表示されたまま計算されてしまいます。
> 自分としては、「1     5」と入力された後にこれをはじくエラー文を
> 書きたいのですが、うまくif文等が思いつきません。

scanf() では、行単位の入力が出来ません。
fgets() で 1行入力してから、sscanf() で値を取り込むようにしましょう。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void tasu(int x, int y, int *t)
{
    *t = x + y;
}

void hiku(int x, int y, int *t)
{
    *t = x - y;
}

int get_int(const char *msg)
{
    char buf[1024], c;  int n;

    for (;;) {
        puts(msg);
        if (fgets(buf, sizeof buf, stdin) == NULL) exit(1);
        if (sscanf(buf, "%d %c", &n, &c) == 1) return n;
    }
}

void tashizan(int count)
{
    int a, b, t;

    a = get_int("1番目の値は?");
    b = get_int("2番目の値は?");
    tasu(a, b, &t);
    printf("1番目と2番目の値を足すと %d\n", t);
    printf("%d回目の足し算でした\n", count);
}

void hikizan(int count)
{
    int a, b, t;

    a = get_int("1番目の値は?");
    b = get_int("2番目の値は?");
    hiku(a, b, &t);
    printf("1番目から2番目の値を引くと %d\n", t);
    printf("%d回目の引き算でした\n", count);
}

int main(void)
{
    char buf[1024], no[1024], c;
    int add_count = 0, sub_count = 0;

    while (1) {
        printf("\n処理の値は(1:足し算, 2:引き算: e:終了)?\n");
        if (fgets(buf, sizeof buf, stdin) == NULL) break;
        if (sscanf(buf, "%s %c", no, &c) != 1) strcpy(no, "0");
        if (     strcmp(no, "1") == 0) tashizan(++add_count);
        else if (strcmp(no, "2") == 0) hikizan(++sub_count);
        else if (strcmp(no, "e") == 0) break;
        else if (strcmp(no, "99")== 0) break;
        else printf("再度入力してください\n");
    }
    printf("処理を終了します\n");
    return 0;
}


No.2634

Re:scanfからの判別文
投稿者---あきさ(2002/09/08 01:22:50)


おかげでうまくいきました。試している最中他の方法も見つかり、大変参考になりました。ありがとうございます。

No.2636

Re:scanfからの判別文
投稿者---かずま(2002/09/08 02:25:07)


> おかげでうまくいきました。試している最中他の方法も見つかり、
> 大変参考になりました。ありがとうございます。

見つかった他の方法って、どういうものですか。ぜひ披露してください。

それから、全文引用は見づらくなるのでやめましょう。
このページの先頭にある「掲示板ご利用上の注意」をよく読んでください。
ソースプログラムを添付するときは、<pre> を使うこと。そのとき、プログラム中の
< や > は &lt; や &gt; に置き換えてください。セミコロンをお忘れなく。
あるいは、用意されている HTML変換ツールを使ってください。