Как использовать strcmp в операторе if для сравнения

Я пытаюсь создать программу C, которая считывает данные из файла .ini. Данные считываются в переменную с именем buffer. Данные в файле .ini выглядят следующим образом:

 [key]
 title= A, H, D, F 

Моя программа выглядит так:

 LPCSTR ini = "C:\\conf.ini";
 char var[100];
 GetPrivateProfileString("key", "title", 0, var, 100, ini);
 char* buffer = strtok(var, ",");
 printf("The complete line is %s", var);

 buffer=strtok(NULL, ",");
 printf(buffer);

 while((buffer= strtok(NULL, ","))!=NULL)
     printf(buffer);

Вывод выглядит примерно так:

The complete line is A, H, D, F
A
H
D
F

Теперь вот что я хочу сделать, это сравнить каждую букву, полученную в «буфере», с символом «A», и если это правда, напечатать «Да», иначе напечатать «Нет». Я пытался использовать strcmp для сравнения, но файл .exe перестал работать.

if (strcmp(buffer, "A")==0)
    printf("Hello")

person Anamika Ana    schedule 15.07.2015    source источник


Ответы (2)


Вот некоторые исправления, которые я внес в ваш код:

  • Я помещаю проверку strcmp() внутрь цикла, чтобы все фрагменты строки, извлеченные из strtok(), проверялись на равенство с "A".

    Первая строка перед разделителем извлекается в buffer, затем продолжается извлечение из buffer до NULL внутри цикла do-while.

  • Поскольку значение вашего файла ini имеет формат пробела после запятой (", "), я изменил разделитель с "," на ", " (добавляя пробел после запятой).

    Хотя это не сильно повлияет на проверку на равенство с "A", так как A не будет затронуто (поскольку оно находится в первой части значения A, H, D, F), проверка значений букв между ними запятые и пробел (например, H, D, F) будут затронуты, если мы будем использовать "," (только запятая) в качестве разделителя.

Измененный код

 #include <stdio.h>
 #include <windows.h>

 int main() {

       LPCSTR ini = "C:\\conf.ini";
       char var[100];
       GetPrivateProfileString("key", "title", NULL, var, sizeof var, ini);
       
       printf("The complete line is %s\n", var);
      
       // first piece of string (letter) before delimiter
       // changed delimiter from "," to ", "
       char* buffer = strtok(var, ", ");
       
       // exits if buffer is NULL
       if ( !buffer )
           return;

       do {  
           // prints the letter
           printf("%s", buffer);
           
           // checking if the extracted piece of code from var is equal with "A",  
           // prints either " Yes" or " No"
           ( !strcmp(buffer, "A") ) ? puts(" Yes") : puts(" No");

       // continues checking until NULL
       } while( buffer = strtok(NULL, ", ") );
 }

Вывод

The complete line is A, H, D, F
A Yes
H No
D No
F No
person raymelfrancisco    schedule 15.07.2015

Что касается вашего формата ввода, здесь присутствуют пробелы, и вы не рассматриваете это как часть разделителя. Так что, как и следовало ожидать, эти пробелы будут присутствовать в строке, на которую указывает bu buffer. Вы можете либо сделать

  • Измените разделитель на " ,"
  • Напишите if (strcmp(buffer, " A")==0) и так далее.

Тем не менее,

  1. printf(buffer); плохой стиль. Либо используйте puts(buffer), либо предпочитайте printf("%s", buffer).
  2. Прежде чем использовать возвращенный указатель, проверьте возврат NULL из strtok().
person Sourav Ghosh    schedule 15.07.2015
comment
Спасибо за исправление стиля. Я забыл исправить оператор printf. Но я до сих пор не понимаю, как мне сравнить содержимое буфера, а затем распечатать оператор, используя if. Не могли бы вы опубликовать небольшой пример кода? Спасибо за помощь в любом случае! - person Anamika Ana; 15.07.2015