[英]What is indeterminate behavior in C++ ? How is it different from undefined behavior?
[英]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));
那是錯的。 *result
是result
指向的東西。 result
是char *
,使其指向一個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.