2011-01-18 14 views
0

私はCプログラミングを学び始めました。このプログラムでは、ユーザー入力をしてから一度に1行ずつ入力して、非整数文字が含まれているかどうかを判断しようとしています。私は、このメソッドをしようとしてきた:Cプログラミングのセグメンテーションフォールト

scanf("%d", &n); 
if (isalpha(n)) 
{ 
i = -1; 
} 

私は少しググとisalphaはそれを行うには良い方法である機能を学びました。しかし、上記のフラグメントを非int型の文字(たとえば文字)でテストするたびに、セグメンテーション違反が発生します。どんな提案もありがとうございます。

+0

nは宣言されている方法は? scanfの戻り値を確認しましたか?いくつの入力項目が割り当てられているかを示します。 –

+0

nと私は何と宣言されていますか?あなたは文脈を伝えることができますか? –

+0

「非文字」とは何ですか? –

答えて

2

%dフォーマット特異強制的にscanf()は数字の文字列しか受け入れません。何か他のものが与えられれば、それは失敗し、nは満たされないままになります(前にnを初期化しなかったと仮定すると、それはガーベッジで埋められます)。

isalpha()は0から255の間の値を期待しており、それを強制するアサーションがあります。私のVC++コンパイラでは、無効な値(非デバッグモード)が指定されていると、アクセス違反でクラッシュします。

これを解決するには、%cフォーマット指定子に切り替えるだけです。 ncharに変換することもお勧めします。これは、1文字を読みやすくするためです。

EDIT:はコメントであなたの明確化を考えると、あなたは、すべてを残して、単に代わりにisalpha()ルートを行くのscanf()の戻り値をチェックすることができます。これは、値の数が正常に読み込まので、それはファイルの非整数または終了に遭遇したとき、それは0例:を返します返します

int main() { 
    int n; 
    while (scanf("%d", &n)) { 
    printf("Got int: %d\n", n); 
    } 
} 
1

なぜあなたはseg-faultを起こしているのかわかりません。私はあなたのプログラムの多くを見なければならないでしょう。

しかし、scanfに "%d"を使用すると整数値のみが受け入れられ、整数ではないnに対して "0"が得られるため、isalpha(n)は常にfalseになり、決して設定されません-1。

おそらく、iを初期化していないため、決して設定されません。後でそれを参照する場合は、おそらくseg-faultの原因になります。このような

使用のscanf( "%cの"、& n)は、:

int main(char** argc, int argv) { 
    char n = 0; 
    int i = 0; 
    scanf("%c", &n); 
    if (isalpha(n)) { 
    i = -1; 
    } 
    printf("you typed %c, i=%d", n, i); 
} 
1

あなたが値を格納する文字バッファを持っていることを確認した文字列としてそれをスキャンして、isalpha()を使用します。:

char buffer[32]; 
sscanf("%32s", buffer); 

// loop and check characters... 
if(isalpha(buffer[i])) .... 

%32sの使用、これは(バッファ32 ==サイズ)バッファオーバーフローを防止するためである

+0

私がintとしてnを開始したのは、プログラムの目的が1行ずつ読み込み、すべてのintを取得して合計に加算するためです。私はファイルの終わりを見つけると、私は合計を出力する必要があります。しかし、要件の1つは、EOFまたは非整数文字が見つかるまで読む必要があることです。 – franchise842

+1

変数宣言でNを使用する場合は、書式文字列にN-1を使用する必要があります**! –

1

nが整数であることを考えると、我々はあなたが読んでいることを診断することができます

(_magic_array[n]&WEIRD_BITMASK) 

nの値がアクセスすることを引き起こしている:isalpha(n)のコードのようなものをやっているように、範囲0..255プラスEOF(通常は-1)ではありませんnに値メモリが制御不能になり、セグメンテーションエラーが発生します。

scanf()以来:

  1. 入力ストリーム内の非整数文字(数字ではないか、空白または記号)がある場合
  2. 、成功したコンバージョンの数を返し、そして
  3. 停止

あなたが使用することができます。

#include <stdio.h> 

int main(void) 
{ 
    char n = 0; 
    while (scanf("%c", &n) == 1) 
     printf("you typed %d\n", n); 
    return 0; 
} 
関連する問題