boat7 发表于 2021-7-13 11:29:30

打印疑惑

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

int main()
{
      char str;

      strncat(str, "I love FishC.com!", sizeof(str));
      printf("str=%s",str);

      return 0;
}
首先,我知道sizeof(str)太短,但是为什么我输出的是str='I love Fis

人造人 发表于 2021-7-13 11:37:48

sizeof(str) 的值是 10
也就是
strncat(str, "I love FishC.com!", 10);
就是复制 10 个字符
I love Fis
10 个字符,有问题吗?

人造人 发表于 2021-7-13 11:50:28

另一个问题
char str;
strncat(str, "I love FishC.com!", sizeof(str));
这里的 str 没有初始化,你就直接 strncat 是有问题的
因为 str 中的内容是随机的
可能你会说这个程序你运行的没有问题呀
的确
这个代码我这边也没问题,但是你能解释下面这个代码为什么输出了 2 次而不是 10 次吗?
不管怎么运行,都是输出 2 次,而且输出的内容也不对
$ cat main.c
#include <stdio.h>
#include <string.h>

int main()
{
    for(size_t i = 0; i < 10; ++i) {
      char str;
      strncat(str, "I love FishC.com!", sizeof(str));
      printf("str=%s\n",str);
    }
    return 0;
}
$ gcc -g -Wall -o main main.c
$ ./main
str=I love Fis
str=I love FisI love Fis
$ ./main
str=I love Fis
str=I love FisI love Fis
$ ./main
str=I love Fis
str=I love FisI love Fis
$ ./main
str=I love Fis
str=I love FisI love Fis
$ ./main
str=I love Fis
str=I love FisI love Fis
$ ./main
str=I love Fis
str=I love FisI love Fis
$ ./main
str=I love Fis
str=I love FisI love Fis
$

人造人 发表于 2021-7-13 11:56:18

这样就初始化了 str
char str = "";
但是这个程序死循环了,因为 str 只有 10 个字节的空间,你只能复制 9 个,但是你复制了 10 个


$ cat main.c
#include <stdio.h>
#include <string.h>

int main()
{
    for(size_t i = 0; i < 10; ++i) {
      char str = "";
      strncat(str, "I love FishC.com!", sizeof(str));
      printf("str=%s\n",str);
    }
    return 0;
}
$ gcc -g -Wall -o main main.c
$ ./main
str=I love Fis
str=I love Fis
str=I love Fis
str=I love Fis
str=I love Fis
str=I love Fis
str=I love Fis
str=I love Fis
str=I love Fis
str=I love Fis
str=I love Fis
str=I love Fis
str=I love Fis
str=I love Fis
str=I love Fis
str=I love Fis
str=I love Fis
str=I love Fis
str=I love Fis
str=I love Fis
str=I love Fis
str=I love Fis
str=I love Fis
str=I love Fis
str=I love Fis
str=I love Fis
str=I love Fis
str=I love Fis
str=I love Fis
str=I love Fis
str=I love Fis
str=I love Fis
str=I love Fis
str=I love Fis
str=I love Fis
str=I love Fis
str=I love Fis
str=I love Fis
str=I love Fis
str=I love Fis
str=I love Fis
str=I love Fis
str=I love Fis
str=I love Fis
str=I love Fis
str=I love Fis
str=I love Fis
str=I love Fis

人造人 发表于 2021-7-13 11:57:13

这样就可以了
$ cat main.c
#include <stdio.h>
#include <string.h>

int main()
{
    for(size_t i = 0; i < 10; ++i) {
      char str = "";
      strncat(str, "I love FishC.com!", sizeof(str) - 1);
      printf("str=%s\n",str);
    }
    return 0;
}
$ gcc -g -Wall -o main main.c
$ ./main
str=I love Fi
str=I love Fi
str=I love Fi
str=I love Fi
str=I love Fi
str=I love Fi
str=I love Fi
str=I love Fi
str=I love Fi
str=I love Fi
$

boat7 发表于 2021-7-13 13:47:52

人造人 发表于 2021-7-13 11:57
这样就可以了

为什么开头会打印出一个'呀{:10_254:}

人造人 发表于 2021-7-13 13:59:11

boat7 发表于 2021-7-13 13:47
为什么开头会打印出一个'呀

因为你的 str 没有初始化,里面的内容是什么都是有可能的
开头打印出一个 ' 就是因为 str 里面存储的是 '
那就在 ' 后面添加 I love FishC.com!

boat7 发表于 2021-7-13 14:04:05

人造人 发表于 2021-7-13 13:59
因为你的 str 没有初始化,里面的内容是什么都是有可能的
开头打印出一个 ' 就是因为 str 里面存储的是...

不好意思,没看全,谢谢了

活動小丑 发表于 2021-7-13 14:18:53

其实我更喜欢这样写。
#include <stdio.h>
#include <string.h>

#define __CONTENT__   "I love FishC.com!"

int main()
{
      char str = { 0 };

      strncat(str, __CONTENT__, sizeof(str));
      printf("str = %s",str);

      return 0;
}

活動小丑 发表于 2021-7-13 14:19:27

活動小丑 发表于 2021-7-13 14:18
其实我更喜欢这样写。

我这样写好像也没啥区别的样子

boat7 发表于 2021-7-13 14:56:09

活動小丑 发表于 2021-7-13 14:18
其实我更喜欢这样写。

我那个是带你学c带你飞第19课的课后作业,你写得挺好

活動小丑 发表于 2021-7-13 15:18:14

boat7 发表于 2021-7-13 14:56
我那个是带你学c带你飞第19课的课后作业,你写得挺好

还行吧。
页: [1]
查看完整版本: 打印疑惑