Сравнение элемента char в массиве с оператором

Я все время искал, как правильно сравнивать элементы char в массиве char, но у меня это не работает. Я пытаюсь сравнить первый символ в массиве символов с оператором (проверяя, существует ли + или -).

EDIT: увидел свою ошибку. Логическая ошибка в операторе if. Спасибо всем за такие быстрые ответы.

Сначала я попробовал это:

    main(int argc, char *argv[]){

    int i;
    int len;
    char input[10];

    for(i = 1; i < 8; i++){

        len = strlen(argv[i]);
        strcpy(input,argv[i]);

        //debug purposes
        printf("%c\n",input[0]);

        if(input[0] != '+' || input[0] != '-')  {
            printf("incorrect number format. %s has no sign.\nnow terminating.\n", input);
        }// end if
    }//end for
}//end main

Затем я прочитал еще несколько сообщений и увидел, что я должен сравнивать символы с помощью strcompare, поэтому я попробовал это: if( !strcmp(input[0],'+') || !strcmp(input[0],'-') )

Тем не менее, они все еще, кажется, не сравнивают должным образом. Я получаю ошибку сегментации с приведенным выше кодом, а с моим предыдущим кодом он печатал оператор, но все равно переходил в оператор if, говоря, что формат неверен. Я все еще довольно новичок в C, поэтому любые советы или подсказки о том, как я могу правильно сравнить эти символы, будут высоко оценены. Спасибо.


person Seephor    schedule 06.02.2012    source источник
comment
Вызов strcpy опасен. Если параметр командной строки имеет более 9 символов, вы будете писать за пределами input (неопределенное поведение). Вам лучше использовать strncpy (или аналогичную функцию) или выделить len + 1 байт для input.   -  person undur_gongor    schedule 07.02.2012


Ответы (3)


Логика исходного условия if неверна:

if(input[0] != '+' || input[0] != '-')

Так будет всегда: если '+'== input[0] условие равно false || true, и наоборот для '-' == input[0].

Так должно быть:

if(input[0] != '+' && input[0] != '-')
person hmjd    schedule 06.02.2012
comment
Ты прав. Я должен был использовать && вместо ||. Спасибо - person Seephor; 07.02.2012

Отдельные символы сравниваются напрямую (например, input[0] != '-'). strcmp и друзья для сравнения строк.

Но ваше условие всегда истинно. Ты хочешь

if(input[0] != '+' && input[0] != '-')  {
    ...
person undur_gongor    schedule 06.02.2012
comment
Ты прав. Я должен был использовать && вместо ||. Спасибо. - person Seephor; 07.02.2012

Вы сравниваете строки с strcmp (это буквально означает: str = "строка", cmp = сравнивать), а не с символами. Сравнения в исходном блоке кода в порядке.

Путаница, вероятно, связана с тем, что вы используете массив символов. В C строки (в значительной степени) эквивалентны массивам символов, поэтому, если вы используете массив символов в качестве строки, тогда strcmp было бы подходящим. Однако вы этого не делаете: вы используете его просто как массив символов, поэтому ваши исходные сравнения в порядке.

Что вам нужно сделать, так это ввести блок if, если оператор не + и не -. Однако вы используете or. Вместо этого попробуйте следующее:

if(input[0] != '+' && input[0] != '-')  {
    printf("incorrect number format. %s has no sign.\nnow terminating.\n", input);
}
person Mac    schedule 06.02.2012
comment
если сравнения в моем исходном коде в порядке, почему они не работают? редактировать: только что увидел, почему. я такой глупый. - person Seephor; 07.02.2012