鱼C论坛

 找回密码
 立即注册
查看: 2457|回复: 25

[已解决]关于带学C飞19课的几个问题~

[复制链接]
发表于 2018-8-22 16:24:44 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 Xlyxcar 于 2018-8-22 16:41 编辑

关于题2
sp180822_161000.png

试了一下代码,没有出错,能正常执行
#include <stdio.h>
#include <string.h>

int main()
{
    char str[10];

    strncat(str, "I love FishC.com!", sizeof(str));
    printf("str:%s, strlen:%d, sizeof:%d", str, strlen(str), sizeof(str));
    return 0;
}
sp180822_161527.png

按照答案改进后就出问题了:
int main()
{
    char str[10];

    strncat(str, "I love FishC.com!", sizeof(str-1));
    printf("str:%s, strlen:%d, sizeof:%d", str, strlen(str), sizeof(str));
    return 0;
}
sp180822_161451.png

还有一个问题,卡在动动手第一题。。
程序会在执行到23行时中断,查了很久,发现是f赋值的问题,好像进了for循环 程序就不承认之前的·int f = 1·一样(如果是java大概会报一个空指针)。。
下面代码在注释调23行之后就不会中断
#include <stdio.h>
#include <string.h>

int main()
{
    char str1[100];
    char str2[100];
    int cp;

    printf("请输入第一个字符串:");
    scanf("%s", str1);
    printf("请输入第二个字符串:");
    scanf("%s", str2);
    printf("请输入比较字符数:");
    scanf("%d", cp);

    int f = 1;
    for(int i=0, j; i<strlen(str1) && i<cp; i++)
    {
        if(j = str1[i] - str2[i] != 0)
        {
            printf("比较的结果是:%d\n", j);
            //f = 0;
            break;
        }
    }
    if(f==1)
    {
        printf("比较的结果是:0\n");
    }

    return 0;
}

第三个问题:
sp180822_164017.png
还有c可以报错吗,每次找个错都要找好久
最佳答案
2018-8-23 11:34:07
Xlyxcar 发表于 2018-8-23 11:27
不是啦你看我初始化之后结果还是不一样 就是下面那个sizeof

sizeof() 的结果是对的,,它不是看字符的长度,而是变量所占内存空间的大小 char str2[10],所以 sizeof(str2) == 10

我只是好奇为什么 str2 打印出来只有 "I lo"
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-8-22 16:44:42 | 显示全部楼层
本帖最后由 claws0n 于 2018-8-23 14:40 编辑

请问您用的是什么编译器,不要跟我说是 vs, code::block 或 dev c++ 之类的
TDM-GCC,MINGW-GCC 还是什么?

我的没有问题 char str[10]   // 只有10个位置
strncat(...sizeof(str))  >> strlen = 12
      str == I love Fis       // 还是有差别的
strncat(...sizeof(str)-1)  >> strlen = 10
      str == I love F

楼主 scanf("%s", &str1)  //字符串不加也可以但是
scanf("%d", &cp)     // 这个一定要加

评分

参与人数 1荣誉 +3 鱼币 +3 贡献 +3 收起 理由
Xlyxcar + 3 + 3 + 3 第二个问题解决

查看全部评分

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

使用道具 举报

发表于 2018-8-22 16:50:40 | 显示全部楼层
算了,你还是顺便告诉我你用的环境是什么好了……vs, code::block 或 dev c++ ?

基本上不需要,只要遇到回车 '\n' 就跳出循环,不再取值

评分

参与人数 1荣誉 +3 鱼币 +3 贡献 +3 收起 理由
Xlyxcar + 3 + 3 + 3 第三个问题解决

查看全部评分

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

使用道具 举报

 楼主| 发表于 2018-8-22 16:50:49 | 显示全部楼层
本帖最后由 Xlyxcar 于 2018-8-22 16:53 编辑
claws0n 发表于 2018-8-22 16:44
请问您用的是什么编译器,不要跟我说是 vs, code::block 或 dev c++ 之类的
TDM-GCC,MINGW-GCC 还是什么 ...


是MinGW + Code::Blocks
sp180822_164729.png

哇加了&之后运行就正常了 我错了我没认真看文档
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-22 17:01:03 | 显示全部楼层
Xlyxcar 发表于 2018-8-22 16:50
是MinGW + Code::Blocks

code::blocks 编译的时候不会报错吗?也会吧?调试要到项目里去,比较麻烦一些而已。
所以基本上是 ch 没有被赋值到,存着相当大的随机值,无法让程序顺利进行而已
这种错误,编译器不会报
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-22 17:13:28 | 显示全部楼层
claws0n 发表于 2018-8-22 17:01
code::blocks 编译的时候不会报错吗?也会吧?调试要到项目里去,比较麻烦一些而已。
所以基本上是 ch  ...


把第一个问题两个代码合起来还是一样 ,然后str2还会多出几个谜之字符,如果字符串初始化为“”就不会有蜜汁字符,可这是为什么呀大佬
#include <stdio.h>
#include <string.h>

int main()
{
    char str1[10];
    strncat(str1, "I love FishC.com!", sizeof(str1));
    printf("str:%s, strlen:%d, sizeof:%d\n", &str1, strlen(str1), sizeof(str1));

    char str2[10];
    strncat(str2, "I love FishC.com!", sizeof(str2-1));
    printf("str:%s, strlen:%d, sizeof:%d\n", &str2, strlen(str2), sizeof(str2));

    return 0;
}
sp180822_171059.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-22 17:25:51 | 显示全部楼层
Xlyxcar 发表于 2018-8-22 17:13
把第一个问题两个代码合起来还是一样 ,然后str2还会多出几个谜之字符,如果字符串初始化为 ...

https://fishc.com.cn/forum.php?mod=viewthread&tid=70569&extra=page%3D1%26filter%3Dtypeid%26typeid%3D583

最安全的方式是确保字符串为空,然后再连接起来。或许这个 str1 或 str2 是函数体内的(局部变量),所以只把内存空间给占了而已,没有初始化。刚好你的 str2 前面有几个字符~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-23 10:00:01 | 显示全部楼层
本帖最后由 Xlyxcar 于 2018-8-23 10:04 编辑


请问我上面那个strlen结果不正确是编译器的问题吗,有解决办法吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-23 10:27:19 | 显示全部楼层
本帖最后由 claws0n 于 2018-8-23 14:40 编辑
Xlyxcar 发表于 2018-8-23 10:00
请问我上面那个strlen结果不正确是编译器的问题吗,有解决办法吗


我是说 scanf() 编译器是不会报错的,因为 scanf 的设计就是 C语言当中最脆弱的功能。只要遇到挫折,就会自动放弃,不会报错
换哪一个编译器都没有用
我用 Dev C++ , MingW-GCC 8.10

因为是局部变量,不会初始化。所以不能保证原本的字符串是空的,而 strncat 是不管你前面有什么,把新的字符串并到后面去
会出现什么结果,就要看你内存装的是什么资料。一般的残值都很大,转成 unicode 出现乱码的结果是合理的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-23 11:27:12 | 显示全部楼层
本帖最后由 Xlyxcar 于 2018-8-23 11:30 编辑
claws0n 发表于 2018-8-23 10:27
我是说 scanf() 编译器是不会报错的,因为 scanf 的设计就是 C语言当中最脆弱的功能。只要遇到挫折,就 ...


不是啦你看我初始化之后结果还是不一样 就是下面那个sizeof
sp180823_112605.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-23 11:34:07 | 显示全部楼层    本楼为最佳答案   
Xlyxcar 发表于 2018-8-23 11:27
不是啦你看我初始化之后结果还是不一样 就是下面那个sizeof

sizeof() 的结果是对的,,它不是看字符的长度,而是变量所占内存空间的大小 char str2[10],所以 sizeof(str2) == 10

我只是好奇为什么 str2 打印出来只有 "I lo"

点评

把取址的拿掉,不需要的 printf("str:%s.....", str2......);  发表于 2018-8-23 11:35

评分

参与人数 1荣誉 +3 鱼币 +3 贡献 +3 收起 理由
Xlyxcar + 3 + 3 + 3 可以的话去吧那题答案改一下吧大大_(:з)∠.

查看全部评分

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

使用道具 举报

 楼主| 发表于 2018-8-23 14:14:48 | 显示全部楼层
claws0n 发表于 2018-8-23 11:34
sizeof() 的结果是对的,,它不是看字符的长度,而是变量所占内存空间的大小 char str2[10],所以 sizeof ...

一样,还是I lo
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-23 14:22:32 | 显示全部楼层
claws0n 发表于 2018-8-23 11:34
sizeof() 的结果是对的,,它不是看字符的长度,而是变量所占内存空间的大小 char str2[10],所以 sizeof ...

我明白了,应该是sizeof(str2)-1而不是sizeof(str2-1), str2-1会被当做整型,sizeof()就是4了
#include <stdio.h>
#include <string.h>

int main()
{
    char str1[10] = "";
    strncat(str1, "I love FishC.com!", sizeof(str1));
    printf("str:%s, strlen:%d, sizeof:%d\n", str1, strlen(str1), sizeof(str1));

    char str2[10] = "";
    strncat(str2, "I love FishC.com!", sizeof(str2)-1);
    printf("str:%s, strlen:%d, sizeof:%d\n", str2, strlen(str2), sizeof(str2));

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

使用道具 举报

发表于 2018-8-23 14:33:06 | 显示全部楼层
Xlyxcar 发表于 2018-8-23 14:22
我明白了,应该是sizeof(str2)-1而不是sizeof(str2-1), str2-1会被当做整型,sizeof()就是4了  ...

还需要改吗?我是照你给的代码敲的~~
改哪里??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-23 14:37:26 | 显示全部楼层
claws0n 发表于 2018-8-23 14:33
还需要改吗?我是照你给的代码敲的~~
改哪里??

改这里
S1E19:字符串处理函数1 | 课后测试题及答案
sp180823_143550.png

点评

搞定  发表于 2018-8-23 14:41
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-23 14:39:25 | 显示全部楼层
Xlyxcar 发表于 2018-8-23 14:37
改这里
S1E19:字符串处理函数1 | 课后测试题及答案

要改的地方还真多,把图也给撤了吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-23 14:40:59 | 显示全部楼层
claws0n 发表于 2018-8-23 14:39
要改的地方还真多,把图也给撤了吧

没有呀就括号往左移两位就好了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-23 14:46:58 | 显示全部楼层
本帖最后由 claws0n 于 2018-8-23 14:48 编辑
Xlyxcar 发表于 2018-8-23 14:40
没有呀就括号往左移两位就好了


哦,你说那个呀?我没权力改~
【实习】而已,他才是真正的【管理员】

补:我再找找资料~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-23 19:44:31 | 显示全部楼层
Xlyxcar 发表于 2018-8-23 14:40
没有呀就括号往左移两位就好了

您的应该对,管理员还没答复我。不过我在猜想,您是不是 32 位的机器??如果是的话,那我知道为什么是 4 了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-24 16:03:17 | 显示全部楼层
claws0n 发表于 2018-8-23 19:44
您的应该对,管理员还没答复我。不过我在猜想,您是不是 32 位的机器??如果是的话,那我知道为什么是 4 ...

64位吧,系统是64位的大大为什么要用您,我看了好方
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-30 07:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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