gpt4 book ai didi

c - 为什么 puts() 函数会给我一个心形符号?

转载 作者:太空宇宙 更新时间:2023-11-04 06:55:40 25 4
gpt4 key购买 nike

我试图弄清楚如何用单个字符填充已知大小的字符串。然后我写了这个简单的代码来解决我遇到的一个更大的问题 (动态填充未知大小的字符串).当我试图编译和运行这段代码时,我遇到了一个输出有心形符号的问题!而且我不知道它来自哪里。

#include <stdio.h>
#include <stdlib.h>

int main()
{
int i;
char str[3];
for(i=0;i<=2;i++){
str[i]=getc(stdin);
}
puts(str);
return 0;
}

谢谢。

最佳答案

C strings是由 null character 终止的字符序列(即代码为 0 的字符)。它可以表示为'\0''\x0' 或简单地表示为0

您的代码用三个字符填充 str 但未能生成 null 终止符。因此,puts()打印它在内存中找到的任何字符,直到它到达第一个 null 字符。

您的代码公开了 Undefined Behaviour .它可以做任何事情,这不是它的错。

为了修复它,您必须确保字符串以 null 终止字符结尾:

#include <stdio.h>
#include <stdlib.h>

int main()
{
int i;
// Make room for 3 useful chars and the null terminator
char str[4];
// Read three chars
for(i = 0; i < 3; i ++) {
str[i] = getc(stdin);
}
// Add the null terminator for strings
str[3] = 0;

puts(str);
return 0;
}

更新

正如@JeremyP 在评论中指出的那样,如果您从 (stdin) 读取的文件在代码读取 3 个字符之前结束,fgetc() 将返回 EOF (文件结尾)字符也是有趣的不可打印字符,让您想知道它们来自哪里。

编写此代码的正确方法是在读取输入文件之前检查输入文件是否到达其 EOF (feof()):

#include <stdio.h>
#include <stdlib.h>

int main()
{
int i;
// Make room for 3 useful chars and the null terminator
char str[4];
// Read at most three chars
for(i = 0; i < 3 && !feof(stdin); i ++) {
str[i] = getc(stdin);
}
// Add the null terminator for strings
str[i] = 0;

puts(str);
return 0;
}

关于c - 为什么 puts() 函数会给我一个心形符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45233156/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com