簡體   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