鱼C论坛

 找回密码
 立即注册
查看: 1190|回复: 10

[已解决]\0

[复制链接]
发表于 2023-9-30 17:52:28 | 显示全部楼层 |阅读模式

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

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

x
原代码
#include <stdio.h>

#define PIVALUE 3.1415926535
#define PI "π"
#define MAKER "风眠"
#define YEAR 2023
#define MONTH 9
#define DAY 30

int main() {
  printf("%s = %d\n", PI, PIVALUE);
  printf("maker: %s\n", MAKER);
  printf("year: %d\n", YEAR);
  printf("month: %d\n", MONTH);
  printf("day: %d\n", DAY);
  return 0;
}
结果
./test
π = -1735908376
maker: 风眠
year: 2023
month: 9
day: 30
加了\0后:
#include <stdio.h>

#define PIVALUE 3.1415926535
#define PI "π"
#define MAKER "风眠"
#define YEAR 2023
#define MONTH 9
#define DAY 30

int main() {
  printf("%s = %d\n", PI, PIVALUE);
  printf("ma\0ker: %s\n", MAKER);//这里加了\0
  printf("year: %d\n", YEAR);
  printf("month: %d\n", MONTH);
  printf("day: %d\n", DAY);
  return 0;
}
结果
./test1
π = -38303256
mayear: 2023
month: 9
day: 30
所以,“ker:%s\n”直接被忽略了?
最佳答案
2023-9-30 19:37:43
风眠 发表于 2023-9-30 17:54
那gcc是怎么直接到下一行的啊?

前三楼都是chatgpt回答的。

gcc编译的时候应该并没有直接跳转到下一行,
printf("ma\0ker: %s\n", MAKER);
这一个句子应该是直接编译到exe程序中的。

然而,这个函数中有一个字符串常量 "ma\0ker: %s\n",在printf函数执行的时候,他一旦遇到'\0'就认为这个字符串结束了,然后就退出了。

所以说只打印了"ma"
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-9-30 17:52:33 | 显示全部楼层
是的,加了 \0 后, \0 后面的字符就被视为字符串的结束符,即使后面还有字符也不会被打印出来。所以在这里, ker: 被忽略了,只打印了 ma 和后面的字符。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-30 17:53:06 | 显示全部楼层
是的,当你在字符串中插入了'\0',它会被视为字符串的结束符,即使后面还有其他字符。所以,在第二个printf语句中,当遇到'\0'时,字符串就被截断了,字符串"maker: "后面的"%s\n"被忽略了。

如果你想要打印出完整的字符串,可以考虑不使用'\0'来截断字符串。或者使用其他方式来表示特殊字符,例如使用转义字符"\0"来打印出字符'\0'本身。

以下是一个示例代码,用于打印出完整的字符串:
#include <stdio.h>

#define PIVALUE 3.1415926535
#define PI "π"
#define MAKER "风眠"
#define YEAR 2023
#define MONTH 9
#define DAY 30

int main() {
    printf("%s = %f\n", PI, PIVALUE);
    printf("maker: %s\n", MAKER);
    printf("year: %d\n", YEAR);
    printf("month: %d\n", MONTH);
    printf("day: %d\n", DAY);
    return 0;
}

希望能解决你的问题!
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-30 17:53:19 | 显示全部楼层
在C/C++中,字符串是以null字符\0结尾的字符数组。当遇到null字符时,printf函数会停止对字符串的输出。因此,在你的代码中,当遇到\0后,printf函数会停止输出之后的字符。

对于第二个例子中的代码:
++#include <stdio.h>#define PIVALUE 3.1415926535#define PI "π"#define MAKER "风眠"#define YEAR 2023#define MONTH 9#define DAY 30int main() {    printf("%s = %d\n", PI, PIVALUE);    printf("ma\0ker: %s\n", MAKER); // 这里加了\0    printf("year: %d\n", YEAR);    printf("month: %d\n", MONTH);    printf("day: %d\n", DAY);    return 0;}
当遇到\0后,printf函数会停止输出\0之后的字符。因此,在输出"ma\0ker: %s\n"时,只会输出"ma",而后面的ker: %s\n"部分被忽略了。

要解决这个问题,你可以使用puts函数来输出字符串,因为puts函数会自动添加换行符,并且不受null字符的影响。例如:
++#include <stdio.h>#define PIVALUE 3.1415926535#define PI "π"#define MAKER "风眠"#define YEAR 2023#define MONTH 9#define DAY 30int main() {    printf("%s = %d\n", PI, PIVALUE);    puts("ma\0ker: " MAKER); // 这里加了\0    printf("year: %d\n", YEAR);    printf("month: %d\n", MONTH);    printf("day: %d\n", DAY);    return 0;}
通过使用puts函数,你可以输出"ma\0ker: 风眠"的完整字符串。

希望这次能够解决你的疑惑!

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-30 17:54:05 | 显示全部楼层
isdkz 发表于 2023-9-30 17:52
是的,加了 \0 后, \0 后面的字符就被视为字符串的结束符,即使后面还有字符也不会被打印出来。所以在这里 ...

那gcc是怎么直接到下一行的啊?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-30 17:57:04 | 显示全部楼层
Mike_python小 发表于 2023-9-30 17:53
在C/C++中,字符串是以null字符\0结尾的字符数组。当遇到null字符时,printf函数会停止对字符串的输出。因 ...

你第一行是什么?还有\0不是空字符NONE吗?怎么会是NULL?(我记得这是空指针指向的啊)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-30 19:37:43 | 显示全部楼层    本楼为最佳答案   
风眠 发表于 2023-9-30 17:54
那gcc是怎么直接到下一行的啊?

前三楼都是chatgpt回答的。

gcc编译的时候应该并没有直接跳转到下一行,
printf("ma\0ker: %s\n", MAKER);
这一个句子应该是直接编译到exe程序中的。

然而,这个函数中有一个字符串常量 "ma\0ker: %s\n",在printf函数执行的时候,他一旦遇到'\0'就认为这个字符串结束了,然后就退出了。

所以说只打印了"ma"
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-30 19:38:51 | 显示全部楼层
风眠 发表于 2023-9-30 17:57
你第一行是什么?还有\0不是空字符NONE吗?怎么会是NULL?(我记得这是空指针指向的啊)

'\0' 的ASCII码是0,对应标识为
NUL
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-30 19:48:27 | 显示全部楼层
额外减小 发表于 2023-9-30 19:38
'\0' 的ASCII码是0,对应标识为

好的,问题解决了。但现在又多了个难题——最佳我到底给谁啊!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-30 21:50:25 | 显示全部楼层
风眠 发表于 2023-9-30 16:48
好的,问题解决了。但现在又多了个难题——最佳我到底给谁啊!!!

给额外减小把,毕竟他是人工
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-10-1 07:40:12 | 显示全部楼层
Mike_python小 发表于 2023-9-30 21:50
给额外减小把,毕竟他是人工

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-6 01:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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