編輯問題
我明白了我在原始問題中給出的代碼中的錯誤,並且我得到的字符是垃圾字符。雖然,我仍然在C約垃圾字符的幾個問題:C中的垃圾字符
垃圾人物有一些模式嗎?這意味着你能預測一個空字符串會出現什麼樣的字符,一個空的整數什麼時候會出現,等等。
當一個變量被聲明時,爲什麼它有一個垃圾字符,而不是空白?有沒有將它與垃圾字符一起存儲的特定原因?
對於沒有空終止的字符串,是否會在每個操作系統上打印相同的垃圾字符?如果是,哪一個?
每個操作系統上都有相同的垃圾字符嗎?或者它們不同?
有沒有辦法在C/C++的
stdout
緩衝區中打印這些字符?有沒有可以用C/C++打印的垃圾字符列表?
原始的問題
原題的題目:用C神祕字符輸出
我以K & [R碰到過這樣的代碼:
int scanline (char str [], int lim) /* Line will be read in 'str []', while lim is the maximum characters to be read */
{
int c, len, j; /* 'len' will have the length of the read string */
j = 0; /* Initializing 'j' */
for (len = 0; (c = getchar()) != EOF && c != '\n'; ++len) /* Reading a character one by one, till the user enters '\n', and checking for failure of 'getchar' */
{
if (len < (lim -2)) /* Checking that string entered has not gone beyond it's boundaries. '-2' for '\n' and '\0' */
{
str [j] = c; /* Copying read character into 'string [j]' */
++ j; /* Incrementing 'j' by 1 */
}
}
if (c == '\n') /* Checking if user has finished inputting the line */
{
str [j] = c; /* Copying newline into string */
++j;
++ len;
}
return len; /* Returning number of characters read */
}
進入K & R,它被稱爲getline
,但我所做的更改,添加的評論,並且因此將其定義爲scanline
。爲了驗證這一點,我做了一個演示程序:
#include <mocl/cancel.h>
int main (int argc, char **argv)
{
int len;
char str [50];
len = scanline (str, 50);
printf ("len = %d\n str = %s\n", len, str);
return 0;
}
所需的頭和功能是在我自己的圖書館,cancel.h
。然後當我編譯我的程序時,它成功了。雖然,當我跑的可執行文件,我得到了意想不到的輸出(我打不了它,因爲我得到它,當我複製,它只是被貼爲「M」字符):
神祕字符當我複製時,複製爲信m
。此外,當我運行我的程序有不同的輸入,我得到不同的神祕輸出:
在另一種情況下,我得到完美的輸出,只是一個空行打印:
我也遇到過this問題,其中用戶獲得相同的符號。
我做了什麼至今?
我搜索了很多,我找不到任何線索有關這個角色,但如果你仔細看,第二圖像中,我得到更多的字符,當我輸入「你好,這是阿希什」。其中之一是斜線,一個是。但我得到另一個字符。我得到了this鏈接,它顯示瞭如何重現它,並解釋它,雖然我不明白。當你運行那裏給出的代碼時,你會得到很多字符,其中一個是。雖然,即使該文章的作者也無法複製,並且沒有發佈。因此,這裏的輸出:
這是實際的輸出,因爲這是不明確的,這裏有一個切出的版本:
所以基本上我才知道,這兩個人物和是字符串中的擴展字符。在那時,我確實找到了scanline
中導致問題的原因。
線條
if (c == '\n') /* Checking if user has finished inputting the line */
{
str [j] = c; /* Copying newline into string */
++j;
++ len;
}
是造成問題,因爲你複製一個換行符到字符串。它的工作,但我不知道爲什麼,因爲這只是一個猜測。我搜查了但仍然找不到原因。
我的問題
'str'不是空終止。 – BLUEPIXY
downvoter可以解釋嗎?我想改善我的帖子。 –
一些工具集會使DEBUG編譯並填充本來不會被填充的內存(因爲您的代碼沒有說),因此您和它的調試庫在測試_some_執行路徑時可以輕鬆捕獲_some_錯誤。 –