C++ Как сравнить два массива типа char?

135
16 июля 2019, 03:40

Нужно ввести группу. Далее перебрать структура, найти запись с совпадающей группой и вывести её.

struct TZap{        
     char n_group[5];
     } Zap;
  char kodG[5];
  scanf("%s", &kodG);            // ввод группы для сравнения
  for (i=0; i < kol-1; i++) {     // Цикл перебора 
    if(mas_Z[i].n_group == kodG) { // Проверка на совпадение
      Out(mas_Z[i]);               // Передает в функцию запись для вывода 
    }
  }

Делал проверку, цикл выполняется нужное количество раз, а вот условие вообще ни разу.

Почему я не могу сделать сравнение mas_Z[i].n_group == kodS?

P.S. Ввел небольшое недрзумение с kodS. Всё из-за моей невнимательности. kodS заменил на kodG.

UPDATE

if(strncmp (mas_Z[i].n_group, kodG,1)==0)     
    puts ("TRUE"); 
else   
    puts ("FALSE");

Возвращает "TRUE". Если использовать strcmp:

strcmp(mas_Z[i].n_group, kodG);

Возвращает 0. Это положительный результат проверки

Answer 1
  1. Использование оператора & с форматом %s в scanf - почти всегда ошибка

    scanf("%s", &kodG);  
    

    Что здесь делает этот &?

    Либо

    scanf("%s", kodG);  
    

    либо (если угодно)

    scanf("%s", &kodG[0]);  
    

    но ни в коему случае не то, что у вас. "На практике" ваш вариант может работать, но это не повод писать подобное.

  2. Использование массива размером всего 5 для пользовательского ввода через scanf("%s" - это серьезная заявка на переполнение буфера со всеми вытекающими. Сделайте хотя бы

    scanf("%4s", kodG);  
    
  3. Сравнение С-строк в С++ делается так же как и в С: функцией strcmp.

    if (std::strcmp(mas_Z[i].n_group, kodG) == 0)
    
  4. Почему я не могу сделать сравнение mas_Z[i].n_group == kodG

    Кто вам такое сказал? Вы можете сделать такое сравнение. Только сравнивать оно будет не содержимое строк, а значения двух указателей (и они, разумеется, будут не равны). А уж что именно вы хотели сравнить - строки или указатели - это у вас надо спрашивать. Компилятор за вас додумывать не будет, он просто делает то, что вы ему сказали делать.

Answer 2

Вам нужна std::strcmp.

Но вообще, если это С++ (судя по тегу), то может иметь смысл избавиться от массивов символов и перейти на std::string.

Как в соседнем ответе заметили, в scanf("%s", &kodG); символ & - лишний. Хотя он здесь создает неопределенное поведение, на практике на работу программы он влиять не должен, по идее.

READ ALSO
Ошибка с OpenAL. no saved enable hardware sample rate converter preference found

Ошибка с OpenAL. no saved enable hardware sample rate converter preference found

Работаю на Mac, использую XcodeЯ решил попробовать поработать с библиотекой alut

211
WinApi MoveFile - корректное слияние двух папок

WinApi MoveFile - корректное слияние двух папок

Подскажите как корректно слить две папки

132
Посимвольный вывод в консоль

Посимвольный вывод в консоль

Требуется посимвольно выводить строку в консоль

141
Ошибка при создании объекта сокета в boost asio

Ошибка при создании объекта сокета в boost asio

Пытаюсь создать объект сокетаПоявляется такая ошибка:

108