[英]What does 'y' in the output stand for in C?
我有一个问题,我在一个循环中构造一个字符串,该字符串输出到stout显示字符串和一个字符'y',上面有两个点作为最后一个字符。
那是什么?
我在这个函数中创建了字符串:
char get_string(char *buf, int ble, FILE *fp, char del)
{
int i = 0;
int c;
char result;
memset(buf, 0, BUFLEN);
do {
c = fgetc(fp);
if (c == del) {
buf[i] = '\0';
result = c;
break;
} else if(c == '\n') {
buf[i] = '\0';
result = '\n';
break;
} else {
buf[i] = c;
i++;
}
} while (c != EOF);
return result;
}
然后在另一个函数中使用buf和结果如下:
char pair[BUFLEN];
char end;
do {
end = get_string(pair, BUFLEN, fp, ';');
printf("Result: %s\n",pair);
} while (pair != NULL);
上面的最后一次迭代打印出“结果:y”我不知道为什么。
你正在使用do
- while
循环,这意味着你在测试EOF
之前正在执行循环体,所以你最终也将EOF
放入缓冲区。 EOF
值-1被转换为与corresponds对应的字符范围。 我建议你只需切换到更常用的while
循环,因为它更自然地处理这种情况。
ÿ是字符的字形(在Unicode和许多ISO-8859-?编码中)具有序数值0xFF。 该值也以十进制表示为255,在某些上下文中也用作“文件结束字符”(又名EOF) - 尽管没有标准定义字符 (AFAIK),值-1当您尝试从耗尽的文件(“文件末尾”)中读取更多内容时,会以多种语言(例如C)返回。
因此,在实践中,输出中的意外ÿ通常意味着您错误地解释了一个意图表示“结束某事”的字节(一个字节编码为所有位设置为1),就像它是要显示的文本的一部分一样。
'y'上面有两个点是字符0xFF(在latin-1中 - 控制台的默认代码页)。
0xFF作为8位有符号值为-1。
查找您将-1作为char打印的位置(或使用-1作为char然后打印它)。
当你“在一个循环中构造你的字符串”时,你还记得用'\\0'
正确地终止它吗?
如果循环将字符分配给字符数组,则最后一个数组项应为'\\0'
。
好的,看到代码后,你正在终止字符串。
编辑 :
看起来你在字符串中包含了EOF字符。 这是字符串未正确终止的一种情况。 您应该在if-else结构中检查EOF并正确处理它。
我注意到的另一件事:
从函数返回时,您正在为char result
分配int c
。 编译器应警告您,您正在尝试将较大的数据类型放入较小的数据类型中。 根据返回值的目的,我会考虑将返回数据类型更改为int
。
你的if
-statement以一个将字符放入缓冲区的else结尾有两个缺点:
EOF
特殊“字符”,它表示流的结束 i
与BUFLEN
值进行比较来检查缓冲区溢出。 第一个问题是你的ÿ字符的原因,当流结束时,你将EOF
字符添加到缓冲区,然后循环终止。
修复是在if-else
语句中放入一个子句来过滤掉它,如下所示:
} else if (c != EOF) {
buf[i] = c;
i++;
}
在修复之前需要决定如何处理的第二个问题,但应该修复它。
您没有正确地终止字符串。 如果从fp读取永远不会返回“del”或“\\ n”并且您达到EOF,则不会有空终止符。 您需要修复代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.