0

Нужно считать с клавиатуры строку и вывести соответствующую оценку. На деле оно постоянно выводит что такой оценки нет

#include "stdafx.h"
#include <string.h>
#include <windows.h>

int _tmain(int argc, _TCHAR* argv[])
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);

    char x[20];
    gets_s(x);

    if (x=="неудовлетворительно") puts("2");
    if (x=="удовлетворительно")  puts("3");
    if (x=="хорошо")  puts("4");
    if (x=="отлично")  puts("5");
    else puts("такой оценки нет");

    return 0;
}

1 Answers1

3

Потому что в C строки так не сравниваются.

В C нету отдельного типа данных для строк со своей операцией сравнения. В C под строкой подразумевается указатель типа char*, указывающий на первый символ. Соответственно при сравнении происходит сравнение указателей — на x и на расположенный где-то в памяти литерал "неудовлетворительно". А указатели будут разными, даже если и содержимое строк одинаковое.

Для сравнения строк используйте strcmp, он сравнивает именно строки.

Да, и чтобы не было проблем с кириллицей, имеет смысл заглянуть сюда (и перейти на wchar_t).

VladD
  • 206,799
  • Пора вводить тег или шаблон C== :) – PinkTux Dec 17 '17 at 00:11
  • @PinkTux: Думаю, имеет смысл кому-нибудь собрать канонический ответ на тему сравнения (и может даже обработки) строк в C. А то буфер фиксированного размера делает мне грустно. – VladD Dec 17 '17 at 00:16
  • wchar_t не удовлетворяет хотелкам современного общества, UTF-8 лучше. – 0andriy Dec 20 '17 at 01:11
  • @0andriy: И чем же оно не удовлетворяет? Я что-то никаких рациональных обоснований не видел. (Нет, манифест utf8everywhere за рациональное обоснование не катит.) – VladD Dec 20 '17 at 01:18
  • Речь не про манифест, конечно. wchar_t устаревший тип, который вмещает в себя только нулевую страничку юникода. Переносимость его так же плохая. – 0andriy Dec 20 '17 at 06:13
  • @0andriy: Ээээ, а чем он более устаревший по сравнению с char? Если вам не нравится wchar_t, чем char лучше? Не говоря уже о том, что (1) консоль Windows поддерживает UTF-16, но не UTF-8. (2) Наивное использование UTF-16 как UCS-2 ломает только emoji, в то время как наивное использование UTF-8 как однобайтной кодировки ломает все нелатинские символы. – VladD Dec 20 '17 at 10:22