簡體   English   中英

從文件未定義行為打印的C行

[英]C line printed from file undefined behavior

我已經制作了一個ac程序,該程序可以解析一種稱為Rapid的語言的源代碼文件,以提取某些在工作中需要記錄的數據。 提取的數據將保存到csv文件,然后將其格式化為excel工作表。

除了我在下面介紹的該功能之外,其他所有功能都可以正常工作。 在某些情況下,我想刪除從文件讀取的行中的所有空格和制表符,以便將語句作為字符串存儲在struct屬性中。

程序沒有崩潰,但是當我用空白刪除新行printf()時,其他一些字符被打印出來。

示例“ cmd.exe”,“ PowerShell \\ v1.0 \\ Modules”,“ igh \\ AppData \\LocaloYSφo¡”

如果我做Printf("%s\\n", currentLine); 打印效果很好

當我使用printf("%s\\n", removeWhiteSpace(currentLine)); 我得到未定義的行為。

這是功能

/******************************************************************
*   Takes a string as input, returns it without tabs or spaces
*   Used to put whole line into the additional commands
*   Attribute
******************************************************************/
static char* removeWhiteSpace(char* string)
{
    int i;
    int j;
    int len = strlen(string);
    char ch;
    char* result = malloc(sizeof(char)*len+1);

    memset(result, 0, sizeof(*result));

    j=0;
    for (i=0; i<len; i++)
    {
        ch = string[i];
        if ((ch != ' ') && (ch != '\t'))
            {
                result[j] = ch;
                j++;
            }
    }

    result[strlen(result)] = '\0';

    return result;
}

另外,我正在使用fgets()從文件中獲取行,並且緩沖區的大小為1000。

不需要的字符在文本文件中不存在,至少不可見。

謝謝您的時間,如果您需要文本文件或程序的其余部分,我可以提供,但是它很長。

另外,我使用的是GCC編譯器的代碼塊IDE,編譯時沒有錯誤或警告。

memset(result, 0, sizeof(*result));

那是錯的。 *resultresult指向的東西。 resultchar * ,使其指向一個char ,和大小char為1這樣的語句設置一個char為零。 不會將分配的內存的整個塊設置為零。

正如我們將看到的,它是不需要的,因此只需刪除該語句即可。

result[strlen(result)] = '\\0';

這句話沒用。 strlen通過查找數組中的第一個空(零)字符來工作。 因此strlen(result)將報告第一個空字符在哪里。 然后result[strlen(result)] = '\\0'; 會將該字符設置為零。 但這已經是零。 因此,此聲明永遠無法完成任何事情。 不僅如此,它還行不通,因為上面的memset無法將內存設置為零,因此在分配的內存中可能沒有空字符可以查找。 在這種情況下,行為不是由C標准定義的。

但是,無需使用strlen查找字符串的結尾。 我們知道字符串的結尾應該在哪里。 對象j一直在計算要寫入result的字符。 因此,也只需刪除此行並使用:

result[j] = '\0';

當我使用printf("%s\\n", removeWhiteSpace(currentLine)); 我得到未定義的行為。

那沒有任何意義。 “未定義的行為”不是問題。 這是缺少的東西。 說某事具有“未定義的行為”意味着C標准未定義行為是什么。 具有未定義行為的程序可能不會打印任何內容,可能會打印所需的結果,可能會打印不希望的結果,可能會打印垃圾字符,可能會崩潰並掛起。

說一個程序產生未定義的行為並不能告訴任何人發生了什么。 相反,您應該對程序的行為進行了特定的描述,例如“程序打印了預期的文本,后跟意外的字符。”復制並粘貼准確的輸入和准確的輸出會很好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM