标题:这段代码编译器为何提示这个错误?这样写为什么不行?如何修改?
只看楼主
b1592187525
Rank: 1
等 级:新手上路
帖 子:86
专家分:4
注 册:2017-2-15
得分:0 
回复 10楼 吹水佬
输入字符串,判断该字符串是否与另一个字符串相等。但问题似乎出现在这行if(gets(m)=="abc")。该如何修改?
#include"stdio.h"
#include"stdlib.h"
main(){
char m[5];
    if(gets(m)=="abc")
      printf("a\n");
      else
      printf("b\n");
  system("pause");
}
对于编译器中的错误提示,"=="左边的gets(m)的类型不是char*吗?为何是int型?等号右边的类型char [4]这是什么类型?

如果不用库函数strcmp是不是就没法对字符串进行比较了?

[此贴子已经被作者于2017-6-24 09:59编辑过]

2017-06-24 09:18
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
以下是引用b1592187525在2017-6-24 09:18:43的发言:
如果不用库函数strcmp是不是就没法对字符串进行比较了?

字符串进行比较不能直接用“==”号。
如果不用库函数strcmp可以自己写字符串比较函数。
如:
#include <stdio.h>

int _strcmp(char *s1, char *s2)
{
    for (; *s1 && *s2 && *s1==*s2; ++s1,++s2) NULL;
    return *s1==*s2 ? 0 : *s1>*s2 ? 1 : -1;
}

main()
{
    char m[5];
    if (_strcmp(gets(m),"abc") == 0)
        printf("a\n");
    else
        printf("b\n");
}

2017-06-25 07:02
b1592187525
Rank: 1
等 级:新手上路
帖 子:86
专家分:4
注 册:2017-2-15
得分:0 
字符串进行比较不能直接用“==”号。
如果不用库函数strcmp可以自己写字符串比较函数。
如:
#include <stdio.h>

int _strcmp(char *s1, char *s2)
{
    for (; *s1 && *s2 && *s1==*s2; ++s1,++s2) NULL;
    return *s1==*s2 ? 0 : *s1>*s2 ? 1 : -1;
}

main()
{
    char m[5];
    if (_strcmp(gets(m),"abc") == 0)
        printf("a\n");
    else
        printf("b\n");
}

[/quote]
虽然可以进行比较,但编译后出现这样的错误提示。

编译器中提到的char*型和int型分别指哪一个?
形参应该是指函数_strcmp中的形参(char *s1,char *s2)为char*型。而实参1是不是指函数_strcmp的类型为int型?因此类型不同.
2017-06-25 13:22
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
回复 13楼 b1592187525
用的是什么编译器?
或者这样试试:
#include <stdio.h>

int _strcmp(char *s1, char *s2)
{
    for (; *s1 && *s2 && *s1==*s2; ++s1,++s2) NULL;
    return *s1==*s2 ? 0 : *s1>*s2 ? 1 : -1;
}

main()
{
    char m[5];
    char a[]="abc";
    gets(m);
    if (_strcmp(m, a) == 0)
        printf("a\n");
    else
        printf("b\n");
}
2017-06-26 07:16
b1592187525
Rank: 1
等 级:新手上路
帖 子:86
专家分:4
注 册:2017-2-15
得分:0 
回复 14楼 吹水佬
用的是vs2015编译器。
这段代码就可以了,
但是对于13楼的代码编译出现的这个问题,能否解答一下:
编译器中提到的char*型和int型分别指哪一个?
形参应该是指函数_strcmp中的形参(char *s1,char *s2)为char*型。而实参1是不是指函数_strcmp的类型为int型?因此类型不同.
2017-06-26 16:50
GBH1
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:5
帖 子:112
专家分:510
注 册:2017-6-13
得分:4 
这样相等才怪。gets(m)返回的是char型数组的首地址,并在字符串后面加‘\0’作为字符串结束标志。而直接定义的字符串,如 char* str = "abc",末尾是没有‘\0’作为结束标志的。所以就占用空间而言,实际是不相等的。详情参考MSDN gets()函数定义。
2017-06-27 10:21
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
以下是引用b1592187525在2017-6-26 16:50:39的发言:

用的是vs2015编译器。
这段代码就可以了,
但是对于13楼的代码编译出现的这个问题,能否解答一下:
编译器中提到的char*型和int型分别指哪一个?
形参应该是指函数_strcmp中的形参(char *s1,char *s2)为char*型。而实参1是不是指函数_strcmp的类型为int型?因此类型不同.

没用过微软的编译器不好说。
可能是不同编译器对语法的解译不同。

2017-07-01 08:15
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
以下是引用GBH1在2017-6-27 10:21:55的发言:

这样相等才怪。gets(m)返回的是char型数组的首地址,并在字符串后面加‘\0’作为字符串结束标志。而直接定义的字符串,如 char* str = "abc",末尾是没有‘\0’作为结束标志的。所以就占用空间而言,实际是不相等的。详情参考MSDN gets()函数定义。

char* str = "abc",是字符串常量,既然是字符串,一定会有结束符。编译器会用‘\0’作为字符串"abc"的结束符。
2017-07-01 08:29



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-478861-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025899 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved