Сравните входное значение символа со значениями массива

#arrays #c #compare

#массивы #c #Сравнить

Вопрос:

Я довольно новичок в программировании. Я пытаюсь сравнить входное значение символа со значениями массива, но, похоже, мой код вообще не сравнивает его (правильно).

Код, который у меня есть до сих пор:

 int main() {
    int colunas = 5;
    int linhas = 6;
    char casa[80];
    char tabela[80][6][5] = {{"a5", "b5", "c5", "d5", "e5", "f5"},
                                      {"a4", "b4", "c4", "d4", "e4", "f4"},
                                      {"a3", "b3", "c3", "d3", "e3", "f3"},
                                      {"a2", "b2", "c2", "d2", "e2", "f2"},
                                      {"a1", "b1", "c1", "d1", "e1", "f1"}};
    scanf("%s", casa); 
      
    for (int i = 0;i< colunas; i  ) {
        for (int j = 0;j < linhas; j  ) {
            printf("%s",tabela[i][j]);

            // Problem happens here.
            if (casa == tabela[j][i]) {
                printf("Verdade");
            }
        }
        
        printf("n"); 
    }
    printf("%s", casa);

    return 0;
}
 

Комментарии:

1. Вам нужно использовать strcmp() для сравнения строк.

2. Массивы @MiloBanks автоматически распадаются на указатели.

Ответ №1:

Поскольку C на самом деле не имеет string типа, а вместо него массив символов, == он не будет работать так, как это было бы с std::string C или std::string::String от Rust.
Что на самом деле происходит при использовании == с массивами символов, так это то, что массивы «распадаются» на указатели, а оператор == на самом деле просто говорит: «является ли ячейка памяти casa той же ячейкой памяти, tabela[j][i] что и «?
Что вам следует сделать, так это использовать стандартную библиотечную функцию strcmp (если вы можете, используйте strncmp , поскольку использование strcmp может привести к уязвимостям кода).
Поэтому вместо:

 if (casa == tabela[j][i]) { /* CODE*/ }
 

выполнить:

 if (strcmp(casa, tabela[j][i]) == 0) { /* CODE*/ }
 

или даже лучше:

 if (strncmp(casa, tabela[j][i], 80) == 0) { /* CODE*/ }
 

Вы можете найти справочные страницы в Интернете для strncmp / strcmp и тому подобное в Интернете, просто выполнив поиск «foo man page» (где foo, очевидно, заменяется на strncmp или что-то в этом роде).

Комментарии:

1. Спасибо, я сделал именно это, но теперь оператор else всегда печатается, даже если он не нужен. Немного расстроен, но я рад, что продвигаюсь.