0

私はCで次のコードを持っています:

#include "stdafx.h"
#include <stdlib.h>
#include <cstring>
#include <ctype.h>

int main()
{
    char buffer[20];
    int num;
    bool valid = true;

    printf("Please enter a number\n");
    fgets(buffer, sizeof(buffer), stdin);
    printf("\n\n");

    if(!isdigit(buffer[0])) //Checking if the first character is -
    {
        if(buffer[0] != '-')
        {
            valid = false;
        }

        else
        {
            if(!isdigit(buffer[1]))
            {
                valid = false;
            }
        }
    }

    char *pend = strrchr(buffer, '\n'); //Replacing the newline character with '\0'

    if (pend != NULL)
    {
        *pend = '\0';
    }

    for (int i = 1; i < strlen(buffer); i++) //Checking that each character of the string is numeric
    {
        if (!isdigit(buffer[i]))
        {
            valid = false;
            break;
        }
    }

    if(valid == false)
    {
        printf("Invalid input!");
    }

    else
    {
        num = atoi(buffer);
        printf("The number entered is %d", num);
    }
    getchar();
}

基本的に、コードはユーザー入力が正または負の整数であることを保証します。文字、浮動小数点数などは使用できません。

コードは完璧に機能し、うまく機能します。

ただし、コードが長すぎるため、多くのプログラムに実装する必要があります。上記のすべてを C で実行する簡単な方法はありますか? おそらく、入力が次のようになることを保証するより短い代替手段:

i) 文字ではない ii) 正または負の整数

4

2 に答える 2

1
bool valid = false;
char *c = buffer;
if(*c == '-'){
   ++c;
}
do {
   valid = true;
   if(!isdigit(*c)){
      valid = false;
      break;
   }
   ++c;
} while(*c != '\0' && *c != '\n');

注: これは 16 進数値を処理しませんが、8 進数 (0 から始まる整数) を渡します。

また、これを共通ライブラリに配置し、関数として呼び出す必要があることに同意する必要があります。

于 2013-03-05T20:23:08.903 に答える
0

strtolで必要なエラーが発生しない可能性があると指摘する人もいますが、これは非常に一般的なタイプのことであるため、標準ライブラリに存在します。

http://www.cplusplus.com/reference/cstdio/sscanf/

#include <stdio.h>

// ....

valid = sscanf (buffer,"%d",&num);

もう1つのコメントは、複雑で便利なコードを記述し、それをモジュール化することを恐れてはならないということです。便利だと思う入力解析ルーチン用のライブラリを作成してください。

于 2013-03-06T00:27:13.413 に答える