2015-03-16 2 views
0

Я пишу функцию для программы, которая позволяет студенту копировать текстовый файл шаблона. Эта функция проверяет вход пользователя, чтобы узнать, разрешен ли его желаемый шаблон для его класса.Сравнение со строковым литералом C++

Я получаю сообщение об ошибке «Сравнение со строковым литералом приводит к неуказанному поведению» в строках 21 и 25. Я сделал «cout < < имя», чтобы проверить правильность хранения переменной, что я знаю это не проблема.

#include <iostream> 
#include <string> 
#include <fstream> 
using namespace std; 

//TEMPLATE CHECK 
//First you check to see if the student is allowed to use the template 
int templateCheck() 
{ 
    //Declare file name variable 
    char name[256]; 

    //Prompt for user input 
    cout << "Enter file name: "; 

    //Cin user input 
    cin >> name; 

    //Begin check 
    //CS221 is the first template you can't use 
    if(name == "/home/cs221Temp.txt") 
     cout << "You are not allowed to use CS221 templates./n"; 

     //CS 321 is the other template you can't use 
     else if (name == "/home/cs321Temp.txt") 
     cout << "You are not allowed to use CS321 templates./n"; 

     //Any others are okay (I commented these out since I'm just working on this function by itself) 
     //else 
     //copyTemplate(); 

     return 0; 
} 
+1

использования 'strcmp' вместо' == '. –

+4

или, даже намного лучше, использовать строковый класс C++, который * имеет * перегруженный == оператор. –

+3

Использование 'std :: string' - Еще проще, чем использование' strcmp' –

ответ

2

Это утверждение

if(name == "/home/cs221Temp.txt") 

сравнивает указатели на равных условиях (что маловероятно), а не их содержание.
То, что вы на самом деле хотите,

if(strncmp(name,"/home/cs221Temp.txt",256) == 0) 

или

std::string name; 

в функции.

+0

На самом деле, если он хочет строки в стиле C, он должен делать' if (strncmp (name, "/home/cs221Temp.txt", 255) == 0) '. Из соображений безопасности следует научиться использовать 'strncmp' /' strlcmp' с самого начала. Обратите внимание на 255 вместо 256, избегая сравнения по нулевому концу символа строки. – tnull

+0

@tnull Ну, я согласен в общем, что использование 'strncmp()' более безопасно против использования 'strcmp()'. Хотя имя будет иметь серьезную проблему, не предоставляя строку с '' \ 0'' и обнаружив проблему дизайна. –

+0

Может быть «проблемой дизайна», но происходит все время. Поэтому я накладываю эмпирическое правило (по крайней мере на себя), чтобы НИКОГДА не использовать 'strcmp' /' strcpy' и так далее.Просто не привыкните. И когда вам нужно подумать о том, что является правильным аргументом числа 'strncmp', вы, вероятно, видите свои недостатки в дизайне намного раньше и более четко. – tnull

0

В C/C++ (в отличие от «похожих» языков, таких как JavaScript), когда вы используете == на «строках», вы сравниваете указатели. Если вы хотите сравнить содержимое строк, то вы должны использовать функции, предназначенные для этой цели. Например, strcmp() из стандартной библиотеки C

1

Вы не можете сравнить две строки в стиле C на ==. (Строковые литералы C-стиля просто дают вам указатель на первый символ в последовательности символов в ОЗУ, заканчивающийся символом 0, поэтому вы должны сравнивать адреса вместо строк).

Что вы хотите использовать, это функция strcmp от stdlib.

Однако, вы пишете на C++, а не С.

Таким образом, я рекомендую использовать string класс, который имеет перегруженный == оператора, так что вы можете сделать

if (string1 == string2) 
Смежные вопросы