鱼C论坛

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

[已解决]\0

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

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

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

x
原代码
  1. #include <stdio.h>

  2. #define PIVALUE 3.1415926535
  3. #define PI "π"
  4. #define MAKER "风眠"
  5. #define YEAR 2023
  6. #define MONTH 9
  7. #define DAY 30

  8. int main() {
  9.   printf("%s = %d\n", PI, PIVALUE);
  10.   printf("maker: %s\n", MAKER);
  11.   printf("year: %d\n", YEAR);
  12.   printf("month: %d\n", MONTH);
  13.   printf("day: %d\n", DAY);
  14.   return 0;
  15. }
复制代码

结果
  1. ./test
  2. π = -1735908376
  3. maker: 风眠
  4. year: 2023
  5. month: 9
  6. day: 30
复制代码

加了\0后:
  1. #include <stdio.h>

  2. #define PIVALUE 3.1415926535
  3. #define PI "π"
  4. #define MAKER "风眠"
  5. #define YEAR 2023
  6. #define MONTH 9
  7. #define DAY 30

  8. int main() {
  9.   printf("%s = %d\n", PI, PIVALUE);
  10.   printf("ma\0ker: %s\n", MAKER);//这里加了\0
  11.   printf("year: %d\n", YEAR);
  12.   printf("month: %d\n", MONTH);
  13.   printf("day: %d\n", DAY);
  14.   return 0;
  15. }
复制代码

结果
  1. ./test1
  2. π = -38303256
  3. mayear: 2023
  4. month: 9
  5. day: 30
复制代码

所以,“ker:%s\n”直接被忽略了?
最佳答案
2023-9-30 19:37:43
风眠 发表于 2023-9-30 17:54
那gcc是怎么直接到下一行的啊?

前三楼都是chatgpt回答的。

gcc编译的时候应该并没有直接跳转到下一行,
  1. printf("ma\0ker: %s\n", MAKER);
复制代码

这一个句子应该是直接编译到exe程序中的。

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

所以说只打印了"ma"
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

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

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

以下是一个示例代码,用于打印出完整的字符串:

  1. #include <stdio.h>

  2. #define PIVALUE 3.1415926535
  3. #define PI "π"
  4. #define MAKER "风眠"
  5. #define YEAR 2023
  6. #define MONTH 9
  7. #define DAY 30

  8. int main() {
  9.     printf("%s = %f\n", PI, PIVALUE);
  10.     printf("maker: %s\n", MAKER);
  11.     printf("year: %d\n", YEAR);
  12.     printf("month: %d\n", MONTH);
  13.     printf("day: %d\n", DAY);
  14.     return 0;
  15. }
复制代码


希望能解决你的问题!
如果问题已经解决,请设置最佳答案
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

对于第二个例子中的代码:
  1. ++
  2. #include <stdio.h>
  3. #define PIVALUE 3.1415926535
  4. #define PI "π"
  5. #define MAKER "风眠"
  6. #define YEAR 2023
  7. #define MONTH 9
  8. #define DAY 30
  9. int main() {
  10.     printf("%s = %d\n", PI, PIVALUE);
  11.     printf("ma\0ker: %s\n", MAKER); // 这里加了\0
  12.     printf("year: %d\n", YEAR);
  13.     printf("month: %d\n", MONTH);
  14.     printf("day: %d\n", DAY);
  15.     return 0;
  16. }
复制代码

当遇到\0后,printf函数会停止输出\0之后的字符。因此,在输出"ma\0ker: %s\n"时,只会输出"ma",而后面的ker: %s\n"部分被忽略了。

要解决这个问题,你可以使用puts函数来输出字符串,因为puts函数会自动添加换行符,并且不受null字符的影响。例如:
  1. ++
  2. #include <stdio.h>
  3. #define PIVALUE 3.1415926535
  4. #define PI "π"
  5. #define MAKER "风眠"
  6. #define YEAR 2023
  7. #define MONTH 9
  8. #define DAY 30
  9. int main() {
  10.     printf("%s = %d\n", PI, PIVALUE);
  11.     puts("ma\0ker: " MAKER); // 这里加了\0
  12.     printf("year: %d\n", YEAR);
  13.     printf("month: %d\n", MONTH);
  14.     printf("day: %d\n", DAY);
  15.     return 0;
  16. }
复制代码

通过使用puts函数,你可以输出"ma\0ker: 风眠"的完整字符串。

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

球一个最佳答案谢谢啦!这对我非常重要!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

那gcc是怎么直接到下一行的啊?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

你第一行是什么?还有\0不是空字符NONE吗?怎么会是NULL?(我记得这是空指针指向的啊)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

前三楼都是chatgpt回答的。

gcc编译的时候应该并没有直接跳转到下一行,
  1. printf("ma\0ker: %s\n", MAKER);
复制代码

这一个句子应该是直接编译到exe程序中的。

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

所以说只打印了"ma"
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

'\0' 的ASCII码是0,对应标识为
  1. NUL
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

好的,问题解决了。但现在又多了个难题——最佳我到底给谁啊!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

给额外减小把,毕竟他是人工
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-22 05:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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