0

ユーザーからの入力を読み取るはずのこの関数をテストしていますが、セグメンテーション違反がスローされます

#include <stdio.h>
#include <string.h>
#include <ctype.h>

#define MAX_STRING_LENGTH 10

int 
readinput(char *input)
{
    int c;
    int i=0;
    while((c=getchar()) != EOF && c != '\n')  //Here is where the warning occurs.
    {
        input[i]=c;
        i++;
    }
    input[i]=0;
    if(strlen(input)>0)
    {
        if(isalpha(input[0]) && input[1]=='-' && isalpha(input[2]) && strlen(input)==3)
            return 0;
        else if(!strcmp(input, "quit"))
            return 1;
        else if(!strncmp(input, "save ", 5))
            return 2;
        else if(!strcmp(input, "undo"))
            return 3;
    }
    return -1;
}

int main()
{
   char *str;
   printf("write a string\n");
   int nr=readinput(str);
   printf("%d\n", nr);
   printf("%s\n", str);
   return 0;
}

私が犯したばかげたエラーに気付きましたが、それでもセグメンテーション違反です。なぜですか?

4

5 に答える 5

2

これは、EOF が (私のコンパイラで) -1 として定義されており、char が符号なしバイトであるためです。だからそれは常にです !=

于 2012-11-09T06:59:34.933 に答える
2
 c != '/n' is wrong

 change it to 

  c != '\n'
于 2012-11-09T06:59:44.443 に答える
2

c != '/n'する必要がありますc != '\n'

\nが続く場合に、改行 を示すエスケープ文字です。/nは 2 つの異なる文字として扱われ、1 つのchar変数と適切に比較することはできません。

strセグメンテーション違反については、main関数にスペースを割り当てる必要があります。

char* str = malloc(sizeof(char)*MAX_STRING_LENGTH);

また

char str[MAX_STRING_LENGTH];

strただし、配列が保持できるよりも多くの文字を含む文字列を読み取ろうとしないようにする必要もあります。

于 2012-11-09T07:00:03.900 に答える
2

スペースを割り当てstrておらず、readinput が存在しない場所にデータを保存しようとするランダムな場所を指しているため、失敗します。

于 2012-11-09T07:07:22.663 に答える
1

関数に初期化されていないポインターを渡したために、セグメンテーション違反が発生しますreadinput()。次のようなことをする必要があります:

char str[4096];

int nr = readinput(str);

呼び出されたコードがその境界をオーバーフローしていないことを確認できるように、配列の長さを渡す必要があります。あるいは、誰かがあなたのプログラムを故意に壊そうとするまでは、4096 が十分に大きいと判断して、危険にさらすこともできます。


元のコンパイラの警告は、複数文字の定数に'/n'(タイプ の) 値があり、これintが に格納できる値の範囲外であるためです。真実に違いない。したがって、警告:charcint!='/n'

Warning: comparison is always true due to limited range of data type

すべての複数文字文字定数には、実装定義の値があります。移植可能な複数文字の文字定数はありません。

ISO/IEC 9899:2011 §6.4.4.4 文字定数

¶10 ... 複数の文字 (例えば ) を含む整数文字定数の値 'ab'、またはシングルバイト実行文字にマップされない文字またはエスケープ シーケンスを含む整数文字定数の値は、処理系定義です。...

于 2012-11-09T07:06:30.443 に答える