这段代码有什么问题,为什么输入对了不能输出yes

2026年09月25日 22:01
有1个网友回答
网友(1):

您需要了解输组名和字符串常量在C/C++代码中的含义。在C/C++中,输组名被视为数组第一个元素的地址,它也是整个数组的首地址,仅仅是地址而已。而字符串常量,在语法上也是一个地址。程序运行的时候,会将字符串常量的内容放在一个储存常量的区域,并且在代码中,这个常量的字面意义就成为了这些内容的首地址。也就是说,我们可以把一个字符串常量(代表一个地址)赋给一个指针,即可以这样写:
const char *p = "abcdgek";
执行这样一条语句后,会创建一个指针变量p,它储存的地址就是字符串"abcdgek"在运行时所在的地址,而无论如何,它本身都不会移动或者改变。所以你的程序用==判断一个字符数组和一个字符串常量是否相等时,其实是在判断数组的地址和字符串常量的地址是否相等,而结果显然是不相等。如果想要比较两个地址上储存的内容是否相同,则需要去依次判断每一个字符是否相同。在C语言的"string.h"或C++的"cstring"文件中,一些库函数封装了对字符串的基本操作,而比较字符串是否相等的函数是strcmp(记:string compare)函数,它的原型是:
int strcmp(const char *, const char*);
两个参数是要参与比较的两个字符串的地址(可以的数组名,也可以是字符串常量),返回值为正、负、或0,要记住这三种值代表的含义,可以讲strcmp理解为用第一个字符串减去第二个字符串得到的差,即如果返回值小于0,那么第一个字符串的字典序小于第二个,等于0,那么两个字符串相同,大于0与小于0相反。这就是strcmp的用法,在你的程序中可以像这样比较两个字符串:
if (strcmp(name, "Sam") == 0) printf("Hello Sam.");
不过,C++更丰富的机制简化了很多操作,推荐使用C++的string类型,它重新定义了操作string类型的==运算符的含义,可以直接使用==进行比较而不必担心细节。给出一个C++的示例:
string str;
cin >> str; // 输入名字
if (str == "Sam") cout << "Hello Sam.";
由于C++稍微修改了一些C语言的规则,并引入了很多全新的机制,它往往能让我们更方便地编写程序,并且也不必先学C再学C++,直接学C++是没有任何问题的,在这里向你推荐C++