[英]strncpy() segmentation fault: shady strtok() manipulations?
我正在編寫一個程序,該程序從用戶那里獲取行並解析它們以進行作業分配。 我受限於一定的內存量,因此我在下面使用的變量是唯一可以使用的變量。
我的代碼出現分段錯誤,並且使用gdb發現它源自以下strncpy()函數調用。 我能看到的唯一原因是str出問題了,這是由於我使用strtok()引起的。 如果有人可以指出我是如何錯誤地使用strtok()或通過空格來解析字符串而不添加任何變量的替代方法,我將不勝感激。
字符串的格式為“ 00 COMMAND 0”,我試圖將最后一位放入數組中,同時保留COMMAND以便以后進行計算。 COMMAND的長度從3到4個字符不等。
char str[11];
*count = 0;
while( scanf( "%[^\n]%*c", str ) == 1 )
{
printf( "\n%s\n", str );
strtok( str, " " );
strtok( NULL, " " );
memory[*count] = atoi( strtok( NULL, " " ) );
strtok( str, " " );
strncpy( str, strtok( NULL, " " ), sizeof( str ) );
strtok通過在標記的末尾添加'\\ 0'字符來更改str。 因此,第二次使用str作為參數調用strtok時,它將僅看到字符串的“ 00”部分。 最簡單的解決方法是在第一次通過令牌化保存命令部分:
strtok( str, " " );
strncpy( str, strtok( NULL, " " ), sizeof( str ) );
memory[*count] = atoi( strtok( NULL, " " ) );
當然,您還應該檢查strtok的返回值,以確保未傳遞錯誤的輸入。
編輯-糟糕。 我沒有意識到您想將命令存儲回str中。 將命令部分復制回str應該是安全的,因為它必須比第一個參數+命令短。 它看起來確實有些狡猾。 您最好使用命令的另一個指針變量。 它僅是另一個4-8字節字節(取決於您的系統)。
char *command;
strtok( str, " " );
command = strtok( NULL, " " );
memory[*count] = atoi( strtok( NULL, " " ) );
在我看來,第一件事就是捕獲並打印來自strtok()
的返回值,或者在您期望非空返回值時檢查它們是否不為空。
給定代碼的第二部分:
strtok(str, " ");
strncpy(str, strtok(NULL, " "), sizeof(str));
您正在使用strncpy()
在自身上復制字符串str
。 那是不確定的行為:
如果在重疊的對象之間進行復制,則行為是不確定的。
當您調用未定義的行為時,任何事情都會發生。
只需將第二個令牌指針保存到'str'。 無需復制。
printf( "\n%s\n", str );
strtok( str, " " ); /* apparently you don't care about this token */
str = strtok( NULL, " " ); /* 'str' now points to COMMAND */
memory[*count] = atoi( strtok( NULL, " " ) );
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.