繁体   English   中英

输出中的'y'代表什么?

[英]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结尾有两个缺点:

  1. 它不会过滤出EOF特殊“字符”,它表示流的结束
  2. 它不会通过将iBUFLEN值进行比较来检查缓冲区溢出。

第一个问题是你的ÿ字符的原因,当流结束时,你将EOF字符添加到缓冲区,然后循环终止。

修复是在if-else语句中放入一个子句来过滤掉它,如下所示:

} else if (c != EOF) {
    buf[i] = c;
    i++;
}

在修复之前需要决定如何处理的第二个问题,但应该修复它。

您没有正确地终止字符串。 如果从fp读取永远不会返回“del”或“\\ n”并且您达到EOF,则不会有空终止符。 您需要修复代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM