Xlyxcar 发表于 2018-8-22 16:24:44

关于带学C飞19课的几个问题~

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

关于题2


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

int main()
{
    char str;

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


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

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


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

#include <stdio.h>
#include <string.h>

int main()
{
    char str1;
    char str2;
    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 - str2 != 0)
      {
            printf("比较的结果是:%d\n", j);
            //f = 0;
            break;
      }
    }
    if(f==1)
    {
      printf("比较的结果是:0\n");
    }

    return 0;
}


第三个问题:

还有c可以报错吗,每次找个错都要找好久{:10_266:}

claws0n 发表于 2018-8-22 16:44:42

本帖最后由 claws0n 于 2018-8-23 14:40 编辑

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

我的没有问题 char str   // 只有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)   // 这个一定要加

claws0n 发表于 2018-8-22 16:50:40

算了,你还是顺便告诉我你用的环境是什么好了……vs, code::block 或 dev c++ ?

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

Xlyxcar 发表于 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


哇加了&之后运行就正常了{:10_266:} 我错了我没认真看文档{:10_266:}

claws0n 发表于 2018-8-22 17:01:03

Xlyxcar 发表于 2018-8-22 16:50
是MinGW + Code::Blocks




code::blocks 编译的时候不会报错吗?也会吧?调试要到项目里去,比较麻烦一些而已。
所以基本上是 ch 没有被赋值到,存着相当大的随机值,无法让程序顺利进行而已
这种错误,编译器不会报{:10_250:}

Xlyxcar 发表于 2018-8-22 17:13:28

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

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

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

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

    return 0;
}

claws0n 发表于 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 前面有几个字符~

Xlyxcar 发表于 2018-8-23 10:00:01

本帖最后由 Xlyxcar 于 2018-8-23 10:04 编辑

claws0n 发表于 2018-8-22 17:25
https://fishc.com.cn/forum.php?mod=viewthread&tid=70569&extra=page%3D1%26filter%3Dtypeid%26typeid% ...

请问我上面那个strlen结果不正确是编译器的问题吗,有解决办法吗{:10_266:}

claws0n 发表于 2018-8-23 10:27:19

本帖最后由 claws0n 于 2018-8-23 14:40 编辑

Xlyxcar 发表于 2018-8-23 10:00
请问我上面那个strlen结果不正确是编译器的问题吗,有解决办法吗

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

因为是局部变量,不会初始化。所以不能保证原本的字符串是空的,而 strncat 是不管你前面有什么,把新的字符串并到后面去
会出现什么结果,就要看你内存装的是什么资料。一般的残值都很大,转成 unicode 出现乱码的结果是合理的。

Xlyxcar 发表于 2018-8-23 11:27:12

本帖最后由 Xlyxcar 于 2018-8-23 11:30 编辑

claws0n 发表于 2018-8-23 10:27
我是说 scanf() 编译器是不会报错的,因为 scanf 的设计就是 C语言当中最脆弱的功能。只要遇到挫折,就 ...

不是啦你看我初始化之后结果还是不一样{:10_266:} 就是下面那个sizeof{:10_284:}

claws0n 发表于 2018-8-23 11:34:07

Xlyxcar 发表于 2018-8-23 11:27
不是啦你看我初始化之后结果还是不一样 就是下面那个sizeof

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

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

Xlyxcar 发表于 2018-8-23 14:14:48

claws0n 发表于 2018-8-23 11:34
sizeof() 的结果是对的,,它不是看字符的长度,而是变量所占内存空间的大小 char str2,所以 sizeof ...

一样,还是I lo{:10_285:}

Xlyxcar 发表于 2018-8-23 14:22:32

claws0n 发表于 2018-8-23 11:34
sizeof() 的结果是对的,,它不是看字符的长度,而是变量所占内存空间的大小 char str2,所以 sizeof ...

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

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

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

    return 0;
}

claws0n 发表于 2018-8-23 14:33:06

Xlyxcar 发表于 2018-8-23 14:22
我明白了,应该是sizeof(str2)-1而不是sizeof(str2-1), str2-1会被当做整型,sizeof()就是4了...

还需要改吗?我是照你给的代码敲的~~{:10_250:}
改哪里??{:10_254:}

Xlyxcar 发表于 2018-8-23 14:37:26

claws0n 发表于 2018-8-23 14:33
还需要改吗?我是照你给的代码敲的~~
改哪里??

改这里{:10_297:}
S1E19:字符串处理函数1 | 课后测试题及答案

claws0n 发表于 2018-8-23 14:39:25

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

要改的地方还真多,把图也给撤了吧

Xlyxcar 发表于 2018-8-23 14:40:59

claws0n 发表于 2018-8-23 14:39
要改的地方还真多,把图也给撤了吧

没有呀就括号往左移两位就好了{:10_245:}

claws0n 发表于 2018-8-23 14:46:58

本帖最后由 claws0n 于 2018-8-23 14:48 编辑

Xlyxcar 发表于 2018-8-23 14:40
没有呀就括号往左移两位就好了

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

补:我再找找资料~

claws0n 发表于 2018-8-23 19:44:31

Xlyxcar 发表于 2018-8-23 14:40
没有呀就括号往左移两位就好了

您的应该对,管理员还没答复我。不过我在猜想,您是不是 32 位的机器??如果是的话,那我知道为什么是 4 了

Xlyxcar 发表于 2018-8-24 16:03:17

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

64位吧,系统是64位的{:10_277:}大大为什么要用您,我看了好方
页: [1] 2
查看完整版本: 关于带学C飞19课的几个问题~