首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C: strcmp错误

C: strcmp错误
EN

Stack Overflow用户
提问于 2015-01-05 23:49:36
回答 3查看 4K关注 0票数 0

我有两个字符串比较,以检查他们是否相同,它工作,但当我打开今天的项目,它游戏我的错误。

代码语言:javascript
复制
warning C4047: 'function' : 'const char *' differs in levels of indirection from 'char (*)[5]'
warning C4024: 'strcmp' : different types for formal and actual parameter 1
warning C4047: 'function' : 'const char *' differs in levels of indirection from 'char (*)[5]'
warning C4024: 'strcmp' : different types for formal and actual parameter 1

printf("Your answer: ");
scanf_s("%s", &answer, 5);
//strlwr(answer);
_strlwr(answer);
if ((strcmp(&answer, "ja") && location[question].rightAnswer == 1) || (strcmp(&answer, "nej") && location[question].rightAnswer == 0) || (strcmp(&answer, "yes") && location[question].rightAnswer == 1) || (strcmp(&answer, "no") && location[question].rightAnswer == 0)){
    printf("Right answer!\n\n");
    points += difficulty;
}
else if ((strcmp(&answer, "ja") && location[question].rightAnswer != 1) || (strcmp(&answer, "nej") && location[question].rightAnswer != 0)){
    printf("Wrong answer!\n\n");
}
else{
    printf("Don't understand your input\n");
}
EN

回答 3

Stack Overflow用户

发布于 2015-01-05 23:55:32

strcmp接受两个const char*,对于第二个参数,你传递的是"ja",这是正确的,而对于第一个参数,你传递的是一个由5个char组成的数组的指针,这就是你在编译器错误中看到char (*) [5]的原因。修复它的方法是

代码语言:javascript
复制
strcmp(answer, "ja");    // & operator NOT applied to answer

当这样做时,数组衰减将启动,类型为char [5]answer将变成char*,一个指向数组第一个元素的字符指针。

当你应用&运算符时,你会得到一个指向数组本身的指针,而不是衰减行为。这是少数几个不会发生衰变的地方之一。另外两个是sizeof和字符串文字初始化器。详情请参见here

票数 3
EN

Stack Overflow用户

发布于 2015-01-05 23:57:23

看起来您是这样定义answer的(这很好):

代码语言:javascript
复制
char answer[5];

在这种情况下,answer实际上已经是一个“指向字符串的指针”。这就是您在调用字符串实用函数时需要使用的全部内容:

代码语言:javascript
复制
strcmp(answer, "ja");
票数 1
EN

Stack Overflow用户

发布于 2015-01-06 00:03:04

警告已经足够清楚了。strcmp的第一个参数的类型与该参数的类型不对应。

当您尝试将指针传递给由五个字符组成的数组char (*)[5]时,参数的类型为const char *

你必须写得很简单

代码语言:javascript
复制
strcmp( answer, "ja" ) 

在本例中,类型为char[5]的字符数组answer被转换为指向函数所需的第一个元素的指针。

考虑到如果你想检查字符串的相等性,你应该写成

代码语言:javascript
复制
if ( strcmp( answer, "ja" ) == 0 ) /*...(/

因此,第一个if语句的正确记录看起来如下所示

代码语言:javascript
复制
if ( ( strcmp( answer, "ja" )  == 0 && location[question].rightAnswer == 1 ) || 
     ( strcmp( answer, "nej" ) == 0 && location[question].rightAnswer == 0 ) || 
     ( strcmp( answer, "yes" ) == 0 && location[question].rightAnswer == 1 ) || 
     ( strcmp( answer, "no"  ) == 0 && location[question].rightAnswer == 0 ) )
{
    printf("Right answer!\n\n");
    points += difficulty;
}

同样,下一条else-if语句也必须重写。

看来这句话也是

代码语言:javascript
复制
scanf_s("%s", &answer, 5);

必须写成这样

代码语言:javascript
复制
scanf_s("%s", answer, sizeof( answer) );
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27782980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档