2016-11-16 2 views
3

Я делаю каменная бумага для ножей. (Rock Scissors) В этом задании нам было предложено использовать номера для сравнения. Отсюда возникает необходимость преобразования пользователей вход 'S' или 'K' или 'P' на 0, 1, 2 repectively.I столкнулись с проблемами, используя STRCMP Funtion, который не кажется работать из-за моего ограниченного понимания указателей и персонажей.Сравнение нескольких символов в C

int comp_number,user_number; 
char user_guess[1], computer_guess[1];  
printf("Please enter S (for stone) or K (for Knife) or P (for Paper).\n"); 

    scanf("%c",&user_guess); 

    comp_number = rand() % 3; 

    /* 
    o = stone 
    1 = kinfe 
    2 = paper 
    */ 


    if(strcmp(user_guess,"S")==0 || strcmp(user_guess,"s")==0){ 

     user_number=0; 

    }else if(strcmp(user_guess,"K")==0 || strcmp(user_guess,"k")==0){ 

     user_number=1; 

    }else{ 

     user_number=2; 
    } 
+2

Это один символ. 'user_guess == 'K'' будет работать нормально. Почему вы слишком усложняете? И да, вы можете использовать инструкцию 'switch/case'. –

+0

Попробуйте использовать «S» вместо «S» и так далее ... '' '' для строк, '' '' для символов – OiciTrap

+0

@OiciTrap 'strcmp' не работает с символами. –

ответ

1

Простой способ сделать чтение и логику (что выглядит лучше) является сканирование к полукокса затем сделать переключатель заявление:

scanf("%c",&user_guess); 

switch (user_guess) { 
    case 'S': 
    case 's': 
     user_number=0; 
     break; 
    case 'K': 
    case 'k': 
     user_number=1; 
     break; 
    case 'P': 
    case 'p': 
     user_number=2; 
     break; 
    default: 
     // You can even do some error handling in here! 
} 

Как было предложено @alk ниже, вы также можете удалить несколько строк с помощью tolower или toupper преобразовать случай, то вам нужно иметь дело только с одной буквой в случае письмо.

+1

Обтекание 'user_guess'' toupper() '/' tolower() 'удаляет еще три строки. – alk

+0

@alk Sure делает. –

1

Либо сделать

char user_guess[2], ... /* C-"strings" are '0'-terminated, 
          that why you always need one more `char`. */ 

... 

scanf("%1s", user_guess); /* Scan in ONLY 1 char! */ 

... 

if (strcmp(user_guess, "S") == 0 || ... 

или

char user_guess, ... 

... 

scanf("%c", &user_guess); 

... 

if (user_guess == 'S') || ... /* Mind the SINGLE quotes! */ 
1

Не более осложнит то так просто!

Вобще if(user_guess == 'S' || user_guess == 's')

strcmp() делает это:

  • если Возвращаемое значение < 0, то это указывает на str1 меньше, чем str2.

  • если возвращаемое значение> 0, то оно указывает, что str2 меньше, чем str1.

  • если возвращаемое значение = 0, то оно указывает, что str1 равно str2.

Так что не будет работать с тем, что вы хотите, и плюс это слишком сложно для такой простой программы :)

+0

"* Так что это не сработает с тем, что вы хотите ... *« Почему? Это будет, просто сделайте подготовку правильно. – alk

+0

Поскольку он сравнивает строки и возвращает 0, они одинаковы. Но вы хотите сравнить только 3 символа, так что можете сделать это через условные обозначения. – MichaelMMeskhi

+0

Я не сказал, что это не сработает, как вы предлагаете. – alk

1

Нет необходимости в user_guess и computer_guess быть строкой.

int comp_number,user_number; 
char user_guess, computer_guess;  

printf("Please enter S (for stone) or K (for Knife) or P (for Paper).\n"); 
scanf("%c",&user_guess); 
comp_number = rand() % 3; 

/* 
o = stone 
1 = kinfe 
2 = paper 
*/ 

if(user_guess == 'S' || user_guess == 's'){ 
    user_number=0; 
    printf("You chose Stone\n"); 
} 
else if(user_guess == 'K' || user_guess == 'k'){ 
    user_number=1; 
    printf("You chose Knife\n"); 
} 
else{ 
    user_number=2; 
    printf("You chose Paper\n"); 
} 
1

Это может быть сделано с помощью ТРОЙНОГО условия оператора, а также.

scanf(" %c",&user_guess); 
int user_number = tolower(user_guess) == 's' ? 0 
       : tolower(user_guess) == 'k' ? 1 
       : tolower(user_guess) == 'p' ? 2 
       : -1; // for error handling 
Смежные вопросы