Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么是';y';在C中的输出代表?_C_String - Fatal编程技术网

什么是';y';在C中的输出代表?

什么是';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);

我有一个问题,我在一个循环中构造了一个字符串,该字符串的输出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;
}
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。