2013-09-23 7 views
0

Я понимаю, указатели (я думаю), и я знаю, что массивы в C передаются как указатели. Я предполагаю, что это относится к аргументам командной строки в main(), как хорошо, но для жизни меня я не могу делать простые сравнения на аргументах командной строки при запуске следующего кода:С командной строки Аргументы

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

int main(int numArgs, const char *args[]) { 

    for (int i = 0; i < numArgs; i++) { 
     printf("args[%d] = %s\n", i, args[i]); 
    } 

    if (numArgs != 5) { 
     printf("Invalid number of arguments. Use the following command form:\n"); 
     printf("othello board_size start_player disc_color\n"); 
     printf("Where:\nboard_size is between 6 and 10 (inclusive)\nstart_player is 1 or 2\ndisc_color is 'B' (b) or 'W' (w)"); 
     return EXIT_FAILURE; 
    } 
    else if (strcmp(args[1], "othello") != 0) { 
     printf("Please start the command using the keyword 'othello'"); 
     return EXIT_FAILURE; 
    } 
    else if (atoi(args[2]) < 6 || atoi(args[2]) > 10) { 
     printf("board_size must be between 6 and 10"); 
     return EXIT_FAILURE; 
    } 
    else if (atoi(args[3]) < 1 || atoi(args[3]) > 2) { 
     printf("start_player must be 1 or 2"); 
     return EXIT_FAILURE; 
    } 
    else if (args[4][0] != 'B' || args[4][0] != 'b' || args[4][0] != 'W' || args[4][0] != 'w') { 
     printf("disc_color must be 'B', 'b', 'W', or 'w'"); 
     return EXIT_FAILURE; 
    } 

    return EXIT_SUCCESS; 
} 

с следующие аргументы: othello 8 0 B

Все работы по сравнению, кроме последнего, проверяют соответствие символов. Я пробовал использовать strcmp(), как и во втором сравнении, в качестве аргументов в качестве аргументов применял «B», «b» (и т. Д.), Но это не сработало. Я также попробовал отливку args[4][0] в char, и это также не сработало. Я попробовал разыменовать args[4], и я попробовал отличить эту ценность.

Выход:

args[0] = C:\Users\Chris\workspace\Othello\Release\Othello.exe 
args[1] = othello 
args[2] = 8 
args[3] = 1 
args[4] = B 
disc_color must be 'B', 'b', 'W', or 'w' 

Я действительно не понимаю, что происходит. В прошлый раз я написал что-то в C год назад, но я помню, что у меня много проблем с манипулированием персонажами, и я понятия не имею, почему. Какая очевидная вещь мне не хватает?

Вопрос: Как сравнить значения в args[4] к персонажу (т.е. арг [4] = 'B' _или_ арг [4] [0] = '! B '). Я просто немного потерялся.

+0

Может быть, это не строка, а персонаж. Strcmp сравнивает строки. Вы можете сравнивать символы, используя 'A' == 'A'. – Reinherd

+0

Ну, по моим сведениям, значение в 'args [4]' является строкой. Поэтому, принимая значение в 'index 0' этой строки (т. Е. Args [4] [0]'), должно работать, потому что значения сравнения - оба символа, но это, похоже, не так. –

+0

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

ответ

1

Ваш код

else if (args[4][0] != 'B' || args[4][0] != 'b' || args[4][0] != 'W' || args[4][0] != 'w') 

всегда будет вычисляться TRUE - это должно быть

else if (args[4][0] != 'B' && args[4][0] != 'b' && args[4][0] != 'W' && args[4][0] != 'w') 
+0

Черт ... Мне нужно повторно взять этот класс по логической логике. Я привык использовать '||' для численных выражений, и я забыл о цели сравнения персонажей. Огромное спасибо! –

Смежные вопросы