1

以下に、特定の値を設定したいコードがあります。イベント i cin a [ は無視する必要があります。ただし、ユーザーが数値ではなく数値を挿入する場合[は、char を int に変換rowsし、else 関数に挿入する必要があります。この char を int に変換して に配置するにはどうすればよいrowsですか?

    char ignoreChar;

    is >> ignoreChar;

    if(ignoreChar == '[')
    {
    }

    else
    {
    rows = ignoreChar;
    }
4

5 に答える 5

1

will に数字が含まれるように適切に注意すればignoreChar、次の方法で簡単に整数に変換できます。

rows = ignoreChar - '0';

このstd::isdigit()関数を使用して、特定の文字が数字を表しているかどうかを確認できます。

次のサンプル プログラムを参考にしてください。

#include <iostream>

using namespace std;

int main()
{
    int i = -1; // Equivalent of your "rows"

    char c; // Equivalent of your "ignoreChar"
    cin >> c;

    if (std::isdigit(c))
    {
        i = c - '0';
    }
    else
    {
        // Whatever...
    }

    cout << i;
}
于 2013-02-12T16:13:09.963 に答える
0

1文字しか入力していない場合は、型キャストできるはずです。

int a =(int)whateverNameOfChar;

これによりASCII番号に変換されるため、「0」を引く必要があります

于 2013-02-12T16:09:42.583 に答える
0

「ユーザー入力の読み取り」には、いくつかの異なるアプローチがあります。

どちらが最適かは、入力の形式/スタイルに少し依存します。"Linebased" と "free form" という 2 つの異なる形式を検討できます。自由形式は、C ソース コードのように入力され、改行、スペースなどを好きな場所に追加できます。

Linebased には一定の形式があり、各行には特定の入力セットが含まれます [入力の数は必ずしも同じではありませんが、行末で特定の入力が終了します]。

自由形式の入力では、文字を読み取ってから、「この特定の部分の意味は何か」を判断し、次に何をするかを決定する必要があります。peek()関数を使用して次の文字が何であるかを確認し、それに基づいて何をすべきかを判断する必要がある場合もあります。

行ベースの入力では、 を使用getline()してテキスト行を読み取り、それを必要な形式に分割します。たとえば、 を使用しstringstreamます。

stream次に、独自のコードを作成する (または基本的な標準変換コードを使用する) か、関数を使用して数値などを解析するかを決定する必要があります。streamさらにコードを書くと、「1234aqj」は数字ではなく、その文字列の「a」に達すると読み取りを停止するなどのエラーを処理するためのより良い方法が得られます。

于 2013-02-12T16:14:11.307 に答える
0

コードが長くなってしまい申し訳ありません。以下は、シンボルを入力して処理する「階乗カウント」のコード例です。さまざまな可能性を示してみました。私が今見ている唯一の問題は、ユーザーが記号を入力せずにEnterキーを押した場合、反応がないことです。これは私の最初の投稿なので、可能なフォント、フォーマット、その他のナンセンスで申し訳ありません. MaxNum = 21 は unsigned long long int 戻り型に対して経験的に定義されています。

そのような入力ケースを確認しました: abcde 2. -7 22 21

#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <cstdlib>

unsigned long long int CalcFact( int p ) 
    { return p == 0 || p == 1 ? 1 : p*CalcFact(p-1); }

int main()
{
int MaxNum = 21, HowMany = 0, MaxAttempts = 5, Attempts = 0;
char AnyKey[] = "", *StrToOut = "The factorial of ", Num[3] = "";
bool IsOK = 0;

while( !IsOK && Attempts++ < MaxAttempts )
{
    std::cout << "Please enter an integer > 0 and <= 21: ";
    std::cin.width(sizeof(Num)/sizeof(char)); 
    std::cin >> Num;
    for( int Count = 0; Count < strlen(Num); Count++ )
        IsOK = isdigit(Num[Count]) ? true : false;
    if( IsOK )
    {
        if( !(atoi(Num) >= 0 && atoi(Num) <= MaxNum) )
            IsOK = false;
        else
        {
            for( int Count = 0; Count <= MaxNum; Count++ )
                {
                std::cout << StrToOut << Count << std::setfill('.') 
                << std::setw( Count < 10 ? 30 : 29 ) 
                << CalcFact(Count) << std::endl; 
                }
        }
    }
    if( !IsOK && Attempts > 0 )
    {
        std::cin.clear(); 
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    }
}
if( !IsOK ) 
    return -1;
else
    std::cin >> AnyKey;
return 0;
}
于 2013-02-13T13:31:07.303 に答える
0

charの 1 つであることがわかっているをその数値のに変換するには、次の'0'ようにします。'9'int

rows = ignoreChar - '0';

これが機能するのは、標準によって数字が連続した値を持つことが保証されているためです。

charが数字かどうかを判断する必要がある場合は、std::isdigit(ignoreChar)または の単純な条件を使用できますignoreChar >= '0' && ignoreChar <= '9'

于 2013-02-12T16:12:35.190 に答える