C++输出错误的字符串

C++ outputting wrong string

本文关键字:字符串 错误 输出 C++      更新时间:2023-10-16
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
char FirstName[50];
char LastName[50];
char MyFirstName[5] = "Bill";
char MyLastName[10] =  "Dillinger";
cout << "Enter your first name" << endl;
cin >> FirstName;
cout << "Enter your last name" << endl;
cin >> LastName;
if (FirstName && LastName) {
cout << "Hello " << FirstName << " " << LastName << endl;
} else if(FirstName == MyFirstName && LastName == MyLastName) {
cout << "Hello, my creator!" << endl;
};

system("pause");
return 0;
}

使用上面的代码,我总是从 if 语句中得到第一个结果。即使我输入我的名字,我也永远不会得到"你好,我的创造者!"。如何修复此代码?

让我们来看看这个。

#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{

到目前为止还不错,但这里有一个简短的插曲:花时间正确缩进您的代码。 这将使维护变得更加容易。 你以后会感谢我的。

在 C++ 中,不需要使用 C 样式字符串。 但是你说你必须这样做,这让我想知道为什么你的导师没有让你使用C。 但无论如何。

    char FirstName[50];
    char LastName[50];
    char *MyFirstName = "Bill";
    char *MyLastName =  "Dillinger";

继续:

    cout << "Enter your first name" << endl;
    cin >> FirstName;
    cout << "Enter your last name" << endl;
    cin >> LastName;

到目前为止很好,但是通过您的if声明,我们遇到了一个问题.. 基本上,在您的旧代码中,FirstName 和 LastName 是指向分配给您的 RAM 块的指针。 它始终是分配的,因为您在堆栈上执行了它。 (也就是说,您没有使用newdelete。 这些指针永远不会NULL,所以你的比较永远是正确的! 此外,在我的版本中,我使用一个名为 strcmp 的标准 C 函数来比较指针指向的字符串。 这是一个重要但微妙的观点。 LastNameMyFirstName等。都是指向您使用上述[50]语法保留的 RAM 块的指针。 如果你直接比较它们,你就是在比较两个数字。

所以,我会改变你的if块,因为第二个测试(平等)绝对有意义。

    if(strcmp(FirstName, MyFirstName) == 0 && strcmp(LastName, MyLastName) == 0) {

如果两个字符串相等,strcmp返回0

        cout << "Hello, my creator!" << endl;
    }
    else {
         cout << "Hello " << FirstName << " " << LastName << endl;
    }

而且我们回家了! 请注意,以下system("pause")命令将正常工作,因为您使用的是Windows。 请记住,它不能移植到Linux等其他平台。

    system("pause");
    return 0;
}

希望对您有所帮助!

毫无意义

if (FirstName && LastName)

没有意义的原因是它总是正确的,FirsName 和 LastName 总是 != 0,因为它们是数组地址。

如果你想读取这样的数组,请使用getline()

std::cin.getline (FirstName,sizeof(FirstName));

现在,当您拥有数组时,像您那样比较它们是没有意义的,数组名称是地址,因此将 FirstName 与 MyFirstName 进行比较永远不会是真的

else if(FirstName == MyFirstName && LastName == MyLastName) 

相反,您需要比较数组的内容,这可以是strcmp

else if (!strcmp(FirstName,MyFirstName) && !strcmp(LastName,MyLastName))

你的第一个 IF 语句将始终为真,因此第二个语句永远不会被执行。
因此,从该语句中删除"else"。
该程序应该正常工作。

if(strcmp(FirstName,MyFirstName) && strcmp(LastName,MyLastName))
{
    cout << "Hello, my creator!" << endl;
};

只是一个提示。使用指针总是更好!