2016-11-24 5 views
0

Почему следующий оператор IF не оценивает значение true, даже если пол [i] имеет значение M char?Сравнение символов для оператора if не оценивается как истинный

for (i=0;i<3;i++) 
if (sex[i] == 'M' || sex[i] == 'm') 

Что я пытаюсь сделать, это создать массив символов, который содержит несколько значений для строк или символов. В этом случае, это характер, и она работает вне, если функции, если я напечатать секс [0] я получаю М.

О, и я знаю, что переменная должна быть объявлена ​​как этот

char sex[size][sizeofstring] 

весь код:

#include <stdio.h> 

int main() { 
    char name[10][256], sex[10][256]; 
    int i; 
    for (i=0;i<3;i++) { 
     printf ("Insert the name of the person %d and her gender, M for male F for female\n", i+1); 
     scanf("%s", name[i]); 
     scanf(" %c", sex[i]); 
    } 
    for (i=0;i<3;i++) 
     if (*sex[i] == 'M' || *sex[i] == 'm') 
      printf ("\n%s", name[i]); 
    for (i=0;i<3;i++) 
     if (sex[i] == 'F' || sex[i] == 'f') 
      printf ("\n%s", name[i]); 
} 
+1

Подождите, почему вы выделения двумерный массив? – yellowantphil

+0

Потому что я googled о том, как создать массив для char, и это то, что мне сказали. Я предполагаю, что второе измерение будет содержать количество символов, которое имеет строка, а первое - количество строк, которые вы хотите получить в массиве. –

+0

Итак, попробуйте 'if (* sex [i] == 'M' || * sex [i] == 'm')' – BLUEPIXY

ответ

0

Учитывая Декларацию

char sex[size][sizeofstring]; 

использование

if (sex[i] == 'M' || sex[i] == 'm') 

не работает, так как это будет операция сравнения указателей. Это эквивалентно:

char* p = sex[i]; 
void* p1 = 78; // Assuming ASCII encoding. 
       // 'M' is an int. The int is converted to a pointer. 
void* p2 = 102; // Again, assuming ASCII encoding 
if (p == p1 || p == p2) 

Это объясняет, почему условно в if заявлении никогда не оценивается как истина.

Решение

Вы должны использовать:

if (strcmp(sex[i], "M") == 0 || strcmp(sex[i], "m") == 0) 

Если ваш компилятор поддерживает нестандартную регистрозависимость функции сравнения строк, stricmp, вы можете объединить два тест.

if (stricmp(sex[i], "M") == 0) 
+0

Как ни странно, когда я использую функцию strcmp, которую вы только что дали мне, она выводит только 2/3 значения для M. Если (* sex [i] ==' M '|| * sex [i] == 'm') работает 3/3. –

+0

@AlexRD, '* sex [i] == 'M'' - это менее строгий тест.Он будет оценивать 'true', независимо от того, что находится в' sex [i] [1] ', если значение в' sex [i] [0] 'равно' 'M''. –

+2

Вы можете комбинировать два теста с помощью 'stricmp()'. – Barmar

1

Вот длинная версия:

char arr[size_1][size_2] 

означает, что я хочу, чтобы хранить Струны (множественное число).

arr[i] 

означает, что я хочу, чтобы получить доступ к i-й строке

arr[i][j] 

означает, что я хочу, чтобы получить доступ к -му символу i-ой строки.

Попробуйте это:

char sex[2][30] = { 
{"My name is this"}, 
{"Your name is this"}}; 

printf("I'm a single character: %c\n", sex[0][5]); 
printf("I'm a string, group of characters: %s\n", sex[0]); 
+0

Спасибо за очищение –

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

  • Нет связанных вопросов^_^