[英]strstr: behavior different using different versions of gcc
我正在將一個與Ubuntu 8.04(gcc版本4.2.4)配合使用的程序移植到10.04(gcc版本4.4.3)。 我有以下代碼:
#include <stdio.h>
#include <string.h>
int main(void) {
char p[100] = "////abcd";
char *t;
/* Remove duplicate slashes, saving only one of them */
while (t = strstr(p, "//"))
strcpy(t, t + 1);
printf("%s\n", p);
return 0;
}
結果應該是/abcd
,它與gcc 4.2.4一致。 對於4.4.3,輸出為/accd
。
你能否建議我使用兩種版本的gcc來提供正確的輸出代碼,並且最好解釋一下這里發生了什么。
提前致謝!
你很幸運。
從strcpy
文檔:
strcpy()函數應將s2指向的字符串(包括終止空字節)復制到s1指向的數組中。 如果在重疊的對象之間進行復制,則行為未定義。
在您的情況下,字符串重疊,您的程序調用未定義的行為。
它曾經工作但不再適用的一個可能原因是strcpy
可以作為GCC的內置實現,如memmove
(即在這種情況下是安全的),但由於性能原因,這變為非安全版本。 (這是純粹的猜測。)
要修復它,請使用memmove
而不是strcpy
,例如:
while (t = strstr(p, "//")) {
memmove(t, t+1, strlen(t)); // strlen(t)'s bytes worth of data
// will cover the string bytes left
// and the \0 terminator
}
這不是非常有效,但它可以移植 - memmove
必須處理重疊的內存區域。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.