#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语句中得到第一个结果。我永远不会得到“你好,我的创造者!”即使我输入我的名字。我该如何修复此代码?
答案 0 :(得分:1)
让我们来看看。
#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为了你。它总是被分配,因为你是在堆栈上完成的。 (也就是说,你没有使用new
和delete
。)这些指针永远不会是NULL
,所以你的比较永远都是真的!另外,在我的版本中,我使用名为strcmp
的标准C函数来比较指针指向的字符串。 这是一个重要但微妙的观点。 LastName
,MyFirstName
等。人。都是指向您使用上面的[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;
}
希望有所帮助!
答案 1 :(得分: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))
答案 2 :(得分:0)
您的第一个IF声明将始终为真,因此第二个永远不会被执行
因此从该陈述中删除'else'
该计划应该正常。
if(strcmp(FirstName,MyFirstName) && strcmp(LastName,MyLastName))
{
cout << "Hello, my creator!" << endl;
};
只是小费。使用指针总是更好!