[英]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.