2014-02-02 4 views
0

У меня есть код консоли C++, который будет искать условие, а затем сохранит текст в файле (.txt).Почему значение не соответствует?

Но состояние здесь не применяется. То, что я в состоянии это:

char command[100]; 
cin >> command; 
if (command == "save") { 
    fstream file; 
    file.open("C:\\Users\\AfzaalAhmad\\Documents\\text.txt"); 
    file << "Data you provided was as saved!"; 
    cout << "File Saved!"; 
} 
else { 
    cout << "Ummm, sir I think there is an error!\n" << 
    "The command you entered was: " << command; 
} 

Что я делаю, чтобы проверить команду, предоставленный пользователем, если команда «Сохранить»

if(command == "save") 

затем сохранить данные в файл, в файле данные присутствуют, когда я использую этот код:

if(command != "save") 

Поскольку команду оленью кожу должна быть сохранить, код выполняется и дает мне данные в файле, который находится в папке документов.

Однако, если блок else выполняется, я все еще вижу правильную команду «сохранить» в конце, которая отображается кодом, как вы можете видеть в блоке кода.

enter image description here

Вы можете видеть, что я использую правильную команду, но она не выполняет, как if(command == "save") но выполнение, если я использую этот код if(command != "save").

Любые указания, пожалуйста?

+1

Почему вы не используете 'std :: string'? С помощью одного можно решить множество проблем – Bojangles

+0

Когда я использую 'std :: string', он дает мне ошибку при использовании' cin >> command' .. @Bojangles :( –

ответ

2

В этом состоянии

if (command == "save") 

вы пытаетесь сравнить массивы символов. Но ни C, ни C++ не имеют оператора сравнения для массивов. Вместо этого строковый литерал и массив в левой части операции неявно преобразуются в указатели на их первые символы, и на самом деле вы сравниваете два указателя, которые всегда будут неравными. Для сравнения символьных массивов следует использовать стандартную функцию C std::strcmp, объявленный в заголовке <cstring> (в C++) или <string.h> (в C)

Например

if (std::strcmp(command, "save") == 0) 
+0

Спасибо, это сработало для меня! :) –

0

Для сравнения c-строк вы должны использовать функцию strcmp().

0

Вы сравниваете адрес command по адресу строкового литерала. Они никогда не будут прежними.

Возможные решения:

  • использовать функции библиотеки C strcpy: if (0 == strcmp(command, "save"))
  • бросили одну в строку C++: if (std::string(command) == "save)
  • Использование C++ 14 строка буквальное: if (command == "save"s)
  • Храните ввод пользователя в строку C++ для начала.

Последний из них является лучшим вариантом, и выглядит следующим образом:

std::string command; 
cin >> command; 
if (command == "save") { 
6

command и строковый литерал "save" оба являются массивами char с. Оба они преобразуются в указатели на первые элементы (это называется преобразованием между массивами и указателями), и вы сравниваете эти указатели. Итак, что вы действительно делаете с command == "save", проверяет, имеют ли их первые символы одинаковый адрес.

Вместо этого, чтобы сравнить строки стиля C, как вы хотите (если все символы в строках одинаковы), вам необходимо использовать std::strcmp. Однако гораздо более предпочтительным решением в C++ является создание command a std::string вместо массива char. std::string поддерживает сравнение с использованием ==.

+0

+1, да, возможно, это была ошибка здесь, в моей case..Я просто сравнивал эти массивы и думал, что будет делать это так же, как и в ASP.NET! –

1

Потому что вы должны использовать strcmp для сравнения строк стиля C. Или используйте std::string, что также лучше во многих других случаях, кроме возможности сравнивать строки с ==.

стиль AC строковая константа является только адрес в некоторой памяти, которая содержит, что определенная строка, поэтому если сравнивать command == "save", то для этого сравнения, чтобы быть правдой, command должны иметь один и тот же адрес, что и константной строки "save" - которые четко ISN Это случай.

0

Переменная command имеет тип char*, т.к. массив в C/C++ является (в основном) указателем (и фиксированным максимальным размером массива). Поскольку вы используете C++, вместо этого используйте вместо этого std::string: http://www.cprogramming.com/tutorial/string.html.

Что вы используете, это строка C-Style, и вы должны использовать такие функции, как strcmp, например, описанные здесь: How do I properly compare strings?. Но это C-образный способ, и, если вы пишете C++, для таких целей вам следует придерживаться класса std::string.

1

command - массив символов, вы не можете сравнить его с строковым литералом (вы фактически сравниваете адреса). Если вы не хотите использовать std :: string, который перегружает оператор ==, вы можете сказать

strcmp(command, "save"); // it returns zero if equal 
Смежные вопросы