2016-07-05 15 views
-4

3つの列、xcoor、ycoor、および2文字のシンボルを含むテキストファイルを、残りのスペースがいっぱいになるようにシンボルの2番目の文字を出力する30x30マップに変換するコードを取得しようとしています。 a '。'しかし、私のコードは実行されていないようで、テキストファイルを入力しようとするとセグメンテーションエラーが発生します。何が間違っていますか?事前のおかげでセグメンテーションエラー、私のコードには何がありませんか?

int main(void) 
{ 
    char grid[30][30]; 
    for(int i=0;i<30;i++){ 
     for(int j=0;j<30;j++){ 
     grid[i][j]='.'; 
     } 
    } 

    int xcoor,ycoor; 
    char symbol[2]; 
    while((xcoor!=0)||(scanf("%d",&xcoor))) 
    { 
     while(xcoor==0){ 
     scanf("%d",&xcoor); 
     } 
     scanf("%d %c%c",&ycoor,&symbol[0],&symbol[1]); 
     grid[xcoor-1][ycoor-1]=symbol[1]; 
    } 

    for(int i=0;i<30;i++){ 
     for(int j=0;j<30;j++){ 
     printf("%c ",grid[i][j]); 
     } 
     printf("\n"); 
    } 

    return 0; 
} 
+0

コードが失敗する箇所をデバッガで調べてみてください。ところで、コードはほとんど読めません。ハードコーディングされた数字が成功する最良の方法:-) – Klaus

+0

「xcoor-1」と「ycoor-1」を検証する[assertions](http://en.cppreference.com/w/c/error/assert)を追加してください'[0、30]'の有効範囲内にあります。 –

+1

1) 'xcoor'は初期化されていません。 2)無効な入力がある場合は、入力バッファー(stdin)をクリアする必要があります。 – BLUEPIXY

答えて

2

これはあなたのエラーのすべてをカバーしていないかもしれないが、すぐに私はこれを参照してください。

int xcoor,ycoor; 
char symbol[2]; 
while((xcoor!=0) 

をあなたはxcoorが今、有効な値を持っていると思いますか?すべき?それはしないので。変数を作成した後、実際に変数を設定する前に、その値をチェックしています。

お使いのscanfコールが原因で問題が発生する可能性があります。いずれにせよ、これらの変数を実際に設定してみてください。おそらくあなたの問題を解決するでしょう。あなたがwhile文の条件付きで初期化されていない変数xcoorを使用しているIs reading from unallocated memory safe?

0

は、詳細はこちらを参照してください。

xcoorを初期化することで修正できます。

さらに重要なことに、ユーザーデータと関連するエラーチェックを読み取るコードを簡素化できます。私が提案しているのは以下のとおりです。

while (scanf("%d%d %c%c", &xcoor, &ycoor, &symbol[0], &symbol[1]) == 4) 
{ 
    if (xcoor < 0 || xcoor >= 30) 
    { 
     // Deal with problem. 
     fprintf(stderr, "Out or range value of xcoor: %d\n", xcoor); 
     exit(1); 
    } 
    if (ycoor < 0 || ycoor >= 30) 
    { 
     // Deal with problem. 
     fprintf(stderr, "Out or range value of ycoor: %d\n", ycoor); 
     exit(1); 
    } 

    grid[xcoor-1][ycoor-1] = symbol[1]; 
} 
関連する問題