鱼C论坛

 找回密码
 立即注册
查看: 1759|回复: 16

[已解决]字符串处理函数的问题

[复制链接]
发表于 2022-4-24 18:14:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
课后作业第4题,https://fishc.com.cn/forum.php?m ... peid%26typeid%3D570

原文是:
#include <stdio.h>
#include <string.h>

int main()
{
        char str1[] = "love";
        char str2[] = "FishC";

        if (strlen(str1) - strlen(str2) < 0)
        {
                printf("字符串"%s"比字符串"%s"短!\n", str1, str2);
        }
        else
        {
                printf("字符串"%s"比字符串"%s"长!\n", str1, str2);
        }

        return 0;
}

小甲鱼的做法是:所以 if (strlen(str1) - strlen(str2) < 0) 应该写成 if (strlen(str1) < strlen(str2))。


我改成< 0结果还是会报错
#include <stdio.h>
#include <string.h>

int main()
{
        char str1[] = "love";
        char str2[] = "FishC";

        if (strlen(str1) - strlen(str2))
        {
                printf("字符串"%s"比字符串"%s"短!\n", str1, str2);
        }
        else
        {
                printf("字符串"%s"比字符串"%s"长!\n", str1, str2);
        }

        return 0;
}


我改成这样的话的话就不会报错答案也是对的
#include <stdio.h>
#include <string.h>

int main()
{
        char str1[] = "love";
        char str2[] = "FishC";

        if (strlen(str1) - strlen(str2) < 0)
        {
                printf("字符串%s比字符串%s短!\n", str1, str2);//把原文多余的"删掉,下面也是这样
        }
        else
        {
                printf("字符串%s比字符串%s长!\n", str1, str2);
        }

        return 0;
}

而且我把多余的“删掉,在把< 0删掉,结果就是:字符串love比字符串FishC短!

为什么
最佳答案
2022-4-24 19:23:51
你自己的方法也是错的,你可以试试把str1和str2位置调换一下,打印的必然还是if里面的语句,而不会是else里的。
strlen返回的是无符号数,根本不存在负数一说,所以原文去和0比较才是错的
你改成strlen(str1) - strlen(str2),两个无符号数做运算,不管怎么样,除非两者相同能得到0,否则还是一个无符号数,所以你这样的判断条件势必会让if获得的参数为“真”,输出的一定是if里的语句,只不过这里正巧和正确答案相同罢了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-24 18:27:54 | 显示全部楼层
没看懂你想问啥,你想说哪段代码是错的,哪段是对的?
你最后说把<0删掉,可最后一段代码还是
if (strlen(str1) - strlen(str2) < 0)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-24 18:31:08 | 显示全部楼层
风车呼呼呼 发表于 2022-4-24 18:27
没看懂你想问啥,你想说哪段代码是错的,哪段是对的?
你最后说把

我按照小甲鱼的方法来,会报错;按照我自己方法来不会报错,在我自己的解决方法的基础上加上小甲鱼的方法,会报错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-24 18:40:00 | 显示全部楼层
单字轩 发表于 2022-4-24 18:31
我按照小甲鱼的方法来,会报错;按照我自己方法来不会报错,在我自己的解决方法的基础上加上小甲鱼的方法 ...

上面哪段代码是你自己的方法不会报错的,哪段是会报错的?
你代码顺序是不是放错了,先说改成<0会报错,放的却是没有<0的版本。又说删掉<0,接的又是一段有<0的代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-24 18:52:34 | 显示全部楼层
风车呼呼呼 发表于 2022-4-24 18:40
上面哪段代码是你自己的方法不会报错的,哪段是会报错的?
你代码顺序是不是放错了,先说改成

第一段是原文,第二段是我自己的方法,第三段是我自己的方法加上小甲鱼的方法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-24 18:56:43 From FishC Mobile | 显示全部楼层
printf("字符串"%s"比字符串"%s"长!\n", str1, str2);这个%s怎么在字符串外,这样肯定报错。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-24 18:59:28 From FishC Mobile | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-4-24 19:02:21 | 显示全部楼层
第二段代码打错了,应该是if (strlen(str1) < strlen(str2)),但是这样还是会错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-24 19:03:16 | 显示全部楼层
zzxhh628 发表于 2022-4-24 18:56
printf("字符串"%s"比字符串"%s"长!\n", str1, str2);这个%s怎么在字符串外,这样肯定报错。

我改了,把”删掉,在把if (strlen(str1) - strlen(str2) < 0) 应该写成 if (strlen(str1) < strlen(str2)),还是错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-24 19:06:19 From FishC Mobile | 显示全部楼层
本帖最后由 zzxhh628 于 2022-4-24 19:08 编辑

用strcmp,根据返回值就可以判断哪个长了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-24 19:08:55 | 显示全部楼层
单字轩 发表于 2022-4-24 19:03
我改了,把”删掉,在把if (strlen(str1) - strlen(str2) < 0) 应该写成 if (strlen(str1) < strlen(str2 ...

用 if (strlen(str1) < strlen(str2))运行没问题,你检查一下有没有其他地方又错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-24 19:09:58 | 显示全部楼层
zzxhh628 发表于 2022-4-24 19:06
用strcmp,根据返回值就可以判断哪个长了。

strlen改成strcmp吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-24 19:15:53 | 显示全部楼层
zzxhh628 发表于 2022-4-24 19:06
用strcmp,根据返回值就可以判断哪个长了。

strcmp在这里是没用的,它比较的是每个字符是否相同,要说比较字符串长短的话,恐怕只有一个字符串是另一个字符串的子串这一种情况才能得出谁长谁短
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-24 19:17:13 From FishC Mobile | 显示全部楼层
你试试先把strlen的值存到变量里,再进行判断。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-24 19:23:51 | 显示全部楼层    本楼为最佳答案   
你自己的方法也是错的,你可以试试把str1和str2位置调换一下,打印的必然还是if里面的语句,而不会是else里的。
strlen返回的是无符号数,根本不存在负数一说,所以原文去和0比较才是错的
你改成strlen(str1) - strlen(str2),两个无符号数做运算,不管怎么样,除非两者相同能得到0,否则还是一个无符号数,所以你这样的判断条件势必会让if获得的参数为“真”,输出的一定是if里的语句,只不过这里正巧和正确答案相同罢了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2022-4-24 19:26:58 From FishC Mobile | 显示全部楼层
风车呼呼呼 发表于 2022-4-24 19:23
你自己的方法也是错的,你可以试试把str1和str2位置调换一下,打印的必然还是if里面的语句,而不会是else里 ...

确实,我没考虑到返回值。
#include <stdio.h>
#include <string.h>

int main()
{
    char str1[] = "love";
    char str2[] = "FishC";
   
    if(strlen(str1)<strlen(str2))
    {
        printf("字符串%s比字符串%s短!\n", str1, str2);
    }
    else
    {
        printf("字符串%s比字符串%s长!\n", str1, str2);
    }

    return 0;
}
改成这样吧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-24 20:33:10 | 显示全部楼层

1. strlen()函数原型:unsigned int strlen (const char *)
2. 无符号整型之间作减法,结果还是无符号整型
代码如下:
#include <stdio.h>
#include <string.h>

int main()
{
    char str1[] = "love";
    char str2[] = "FishC";
    printf ("%u\n", strlen(str1) - strlen(str2));  //strlen()函数返回值unsigned int,无符号整型减法后还是无符号整型,打印出来

    if ((int)(strlen(str1) - strlen(str2)) < 0)
        printf("字符串%s比字符串%s短!\n", str1, str2);
    else
        printf("字符串%s比字符串%s长!\n", str1, str2);

    return 0;
}

验证结果:
4294967295
字符串love比字符串FishC短!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-17 21:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表