簡體   English   中英

strncpy()分段錯誤:不可靠的strtok()操縱?

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

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