2015-10-14 2 views
1

Я просто создаю программу, чтобы угадать некоторые случайные пары в массиве, если угадать, удалите эту пару.scanf confusion with type error

Я столкнулся с проблемой, из-за которой я могу ввести только целое число. Каждый раз, когда я пытался ввести тип *, программа выйдет из строя. Я использую такое состояние, как:

if (scanf("%d",&temp)==1) 

, чтобы попытаться исправить мою проблему, но это действительно не работает.

вот мой код и, пожалуйста, дайте мне некоторую помощь:

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

int main() 
{ 
    int r[4]; //random 
    int s[8]; //store 
    char c[8]; //cover 
    int g[8]; //guess 
    int i; 
    int round=0; 
    int left = 4; 
    int point = 0; 
    int clear_index[2]; 
    int temp; 

// generate random number 
for (i=0;i<4;i++) 
{ 
    r[i] = (rand()%10)+1; 
    s[i] = r[i]; 
    s[i+4] = r[i]; 
} 
// show the default number 
printf("[show] "); 
for (i=0;i<8;i++) 
{ 
    printf("%d ",s[i]); 
    c[i] = '*'; 
} 
printf("\n"); 

while(left>0) 
{ 
    // print left 
    printf("[cover] "); 
    for (i=0;i<8;i++) 
     printf("%c ",c[i]); 
    printf("\n"); 
    //guess 
    printf("[guess] "); 
    for(i=0;i<8;i++) 
    { 
     if (scanf("%d",&temp)==1) 
      g[i] = temp;   

     if (g[i] == s[i]) 
     { 
      printf("v\n"); 
      clear_index[point] = i; 
      point++; 
     } 
    } 
    if (point == 2) 
    { 
     for (i=0;i<2;i++) 
      c[clear_index[i]]=' '; 
     left-=1; 
     point = 0;   
    } 
    round+=1; 
    //left-=1; 
} 
printf("you won in %d round",round);  

}

+0

Этот 'scanf ("% d ", & temp)' предназначен для получения целых чисел, которые вы печатаете. Вы хотите ввести цифры или символы? –

+0

Я пытаюсь отфильтровать не целое число. – KennyYang

+0

цикл, начинающийся с: 'for (i = 0; i <8; i ++)' может установить до 8 значений в 'int clear_index [2];', но clean_index может содержать только 2 значения. И.Е. запись за пределами массива, который вызывает неопределенное поведение. Это может привести к событию сбоя seg. – user3629249

ответ

1

Вы получаете ошибку сегментации, потому что, в случае, вы не вошли в число, зсапЕ не будет возвращать 1 , а затем, используя g[i], вызывается undefined behavior.

FWIW, g - это локальная переменная автоматического массива и, если явно не определена, будет иметь неопределенное значение. Попытка прочитать значение вызовет UB.

Решение:

  1. Всегда инициализировать локальные переменные.
  2. В случае scanf() терпит неудачу, вы должны съедает в недопустимый вход с помощью какого-то цикла, как while (getchar != '\n');, прежде чем приступить к принятию следующего входа.
+0

Я не уверен, где я могу добавить этот цикл? Должен ли я добавить его до if (scanf ("% d", & temp) == 1)? – KennyYang

+0

@KennyYang nope. в другой части инструкции if, связанной с scanf. –

+0

Я не уверен, как есть эти недопустимые входные данные, я просто ничего не хочу делать, когда вход недействителен. Я прошу вот так: else { char c; while ((c = getchar())! = '\ N') c = '\ n'; } Правильно ли есть недопустимый ввод, назначая ввод как '\ n' ?? – KennyYang

0

Вы читаете номер, но пользователь может поместить цифру. Чтобы предотвратить это, вы можете использовать функцию atoi() из библиотеки stdlib.h. Он преобразует строку в целое число, если целое число является числом цифр, оно преобразует его в целое число. Если это символ, он вернет 0. Поэтому вам просто нужно предотвратить появление 0 после вызова функции atoi().