什么是';y';在C中的输出代表?
我有一个问题,我在一个循环中构造了一个字符串,该字符串的输出stout显示该字符串和一个字符“y”,上面有两个点作为最后一个字符 那是什么 我在此函数中创建字符串:什么是';y';在C中的输出代表?,c,string,C,String,我有一个问题,我在一个循环中构造了一个字符串,该字符串的输出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);
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;
}
char pair[BUFLEN];
char end;
do {
end = get_string(pair, BUFLEN, fp, ';');
printf("Result: %s\n",pair);
} while (pair != NULL);
然后在另一个函数中使用buf并得出如下结果:
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;
}
char pair[BUFLEN];
char end;
do {
end = get_string(pair, BUFLEN, fp, ';');
printf("Result: %s\n",pair);
} while (pair != NULL);
上面的最后一次迭代打印出“Result:y”,我不知道为什么。当您“在循环中构造字符串”时,是否记得用'\0'
正确终止它
如果循环将字符分配给字符数组,则最后一个数组项应为'\0'
好的,在看到代码后,您将终止字符串
编辑:
看起来您正在字符串中包含EOF字符。这是字符串未正确终止的一种情况。您应该检查if-else结构中是否存在EOF,并正确处理它
我还注意到一件事:
从函数返回时,将
int c
分配给char结果
。编译器应该警告您,您正试图将较大的数据类型放入较小的数据类型中。根据返回值的用途,我会考虑将返回数据类型更改为int
'y',上面有两个点是字符0xFF(拉丁语-1-控制台的默认代码页)
0xFF作为8位有符号值为-1
查找将-1打印为字符的位置(或者使用-1作为字符,然后打印它)。在执行
循环时使用do
-,这意味着在测试EOF
之前执行循环体,因此最终也会将EOF
放在缓冲区中。-1的EOF
值被转换为对应于ÿ的字符范围。我建议您切换到更常见的while
循环,因为它更自然地处理这种情况。ÿ是字符的标志符号(在Unicode和许多ISO-8859-?编码中)具有序号0xFF。该值在十进制中也称为255,在某些上下文中也用作“文件结尾字符”(也称为EOF)——尽管没有标准将字符定义为AFAIK,但在许多语言(如C)中,当您尝试从已耗尽的文件(“文件结尾”)中读取更多内容时,返回的值-1是
因此,在实践中,输出中出现意外的ÿ通常意味着您错误地解释了一个表示“某物结束”的字节(将所有位设置为1的字节编码),就好像它是要显示的文本的一部分一样。您的if
-语句,以else结尾将字符放入缓冲区有两个缺陷:
它不会过滤掉表示流结束的EOF
特殊“字符”
它不会通过比较i
和BUFLEN
值来检查缓冲区溢出
第一个问题是ÿ字符的原因,当流结束时,将EOF
字符添加到缓冲区,然后循环终止
解决方法是在if-else
语句中放入一个子句以过滤掉它,如下所示:
} else if (c != EOF) {
buf[i] = c;
i++;
}
第二个问题需要在修复之前决定如何处理,但它应该被修复。您没有正确地使用null终止字符串。如果从fp读取从不返回“del”或“\n”,并且您到达EOF,则不会有空终止符。你需要修正你的代码。小细节-这是Unicode代码点的标志符号U+00FF
,它在UTF-8中对应于字节0xFF
@Jesse,在Unicode中它可以写成U+00FF(十进制中有顺序值255,十六进制中有FF,等等),在ISO-8859-1(&c)中它当然不能用“U”前缀写(当0xFF仍然正确时;-),UTF-8中的这个码点被编码为一个双字节序列0xC3 0xBF,这与OP的问题无关。糟糕的是,你是对的,在UTF-8中它是一个双字节序列。但是我认为引用Unicode码点的正确方法是U+00FF
,而0xFF
指的是设置了所有位的字节(或者简单地说是数字255)。当然,这只是通过阅读有关Unicode的点点滴滴得出的。我不是专家,所以我很高兴被纠正。(例如,维基百科页面只引用U+的代码点)。不过,我可能不应该在没有思考的情况下提到UTF-8位:)-1用于误导性解释(C中没有EOF“character”,也没有值255或任何其他值;它是带外指示符值)。您没有看到的问题是,代码有一个常见的初学者错误,即在读取最后一个字符后设置EOF。