为什么价值不匹配?

时间:2014-02-02 17:51:33

标签: c++

我有一个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;
}

我正在做的是,检查用户提供的命令,如果命令是'save'

if(command == "save") 

然后将数据保存到文件中,当我使用此代码时,数据存在于文件中:

if(command != "save") 

因为命令不必保存,代码会执行并向我提供文档文件夹中文件中的数据。

但是,如果else块被执行,我仍然可以在最后看到正确的命令'save',这可以通过代码块中显示的代码显示。

enter image description here

你可以在那里看到,我正在使用正确的命令,但它没有以if(command == "save")执行,但如果我使用此代码if(command != "save")则会执行。

请问任何指导?

7 个答案:

答案 0 :(得分:6)

command和字符串文字"save"都是char的数组。它们都被转换为指向第一个元素的指针(这称为数组到指针的转换),并且您正在比较这些指针。因此,您command == "save"正在做的是检查他们的第一个字符是否具有相同的地址。

相反,要比较您想要的C风格字符串(检查字符串中的所有字符是否相同),您需要使用std::strcmp。但是,在C ++中更优选的解决方案是使command成为std::string,而不是char的数组。 std::string支持使用==进行比较。

答案 1 :(得分:2)

在这种情况下

if (command == "save") 

您正在尝试比较字符数组。但C和C ++都没有数组的比较运算符。相反,字符串文字和操作左侧的数组被隐式转换为指向其第一个字符的指针,实际上您正在比较两个始终不相等的指针。 要比较字符数组,您应该使用在标头std::strcmp(在C ++中)或<cstring>(在C中)声明的标准C函数<string.h>

例如

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

答案 2 :(得分:1)

因为您应该使用strcmp来比较C样式字符串。或者使用std::string,除了能够将字符串与==进行比较之外,它在许多其他方面也更好。

AC样式字符串常量只是包含该特定字符串的某个内存的地址,因此当您比较command == "save"时,为了使该比较为真,command必须具有与常量字符串"save" - 显然不是这种情况。

答案 3 :(得分:1)

命令是一个char数组,你不能将它与那样的字符串文字进行比较(你实际上在比较地址)。如果你不想使用重载==运算符的std :: string,你可以说

strcmp(command, "save"); // it returns zero if equal

答案 4 :(得分:0)

为了比较c字符串,你应该使用strcmp()函数。

答案 5 :(得分:0)

您正在将command的地址与字符串文字的地址进行比较。他们永远不会是一样的。

可能的解决方案:

  • 使用C库函数strcpyif (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 :(得分:0)

变量command的类型为char*,因为C / C ++中的数组(基本上)是一个指针(和一个固定的最大数组大小)。由于您使用的是C ++,请考虑使用std::string代替:http://www.cprogramming.com/tutorial/string.html

您使用的是C样式字符串,您必须使用strcmp等函数,例如:How do I properly compare strings?。但这就是C-way,如果你正在编写C ++,你应该坚持使用std::string类来达到这个目的。