[英]Why printf() prints this mysterious extra text, on Windows?
我最近編寫了一個簡單的程序來反轉一個字符串,我的程序只接受來自用戶的輸入字符串,然后將其反轉。 這一切都是用2個指針完成的。 關於程序中的指針安全性,我編寫了一個復制給定字符串的函數,該函數為新的(相同長度)字符串分配內存,然后逐個復制字符。
我的問題是當我運行這個程序時,雖然它做了我需要的東西,它打印出一些神秘的額外輸出。 在接受用戶的輸入之前,它每次都這樣做。 這是我運行程序時發生的情況。
C:\Users\0xEDD1E\Desktop\revstr>revstr.exe
[C]
[.]
[revstr.exe]
hello
[hello]
olleh
這里最后三行是輸入和輸出,沒關系,問題出在前3行
[C]
[.]
[revstr]
那些是什么? 無論如何,這是我的計划
#include <stdio.h>
#include <stdlib.h>
#define swap(a, b) (((a) ^ (b)) && ((a) ^= (b), (b) ^= (a), (a) ^= (b)))
unsigned long strlen_(char *);
char *strdup(char *s);
char *reverseString(char *, int);
int main(void)
{
//fflush(stdout);
char *str = (char *) malloc(1024 * sizeof (char));
scanf("%[^\n]s", str);
int slen = strlen_(str);
printf("%s\n", reverseString(str, slen));
return 0;
}
unsigned long strlen_(char *s)
{
char *p = s;
while (*p) p++;
return p - s;
}
char *strdup(char *s)
{
char *p = (char *) malloc((size_t) (strlen_(s) + 1) * sizeof (char));
if (p) {
char *pp = p;
while ((*pp++ = *s++)) ;
}
printf("[%s]\n", p);
return p;
}
char* reverseString(char* s, int n)
{
char *str = strdup(s);
char *p = str - 1;
char *q = str + n;
while (++p < --q) {
swap(*p, *q);
}
return str;
}
可以看到,在看, strdup()
函數中,通過將所生成的那些線printf()
中strdup()
函數(因為printf("[%s]\\n, str);
)。
所以我想我找到了錯誤點。 但我無法弄清楚這個錯誤的原因,以及解決它的方法。 特別是這只發生在Windows上(我的是Windows 10 Pro)。 我在Ubuntu(64位)上測試了這個,在Ubuntu中沒有這樣的bug。
我的直覺告訴我這個錯誤必須用函數中使用的指針做一些事情
更新:我試過fflush(stdout)
但這沒有幫助
這個Bug(或行為不端)背后的原因是什么,有人可以解釋原因嗎?
可能,您的系統的C庫還定義了一個函數strdup
,程序啟動中的一些代碼調用該函數。 然后鏈接器將這些調用鏈接到strdup
函數而不是系統函數。
為了避免這種情況,不命名你的函數strdup
,或str
為此事東西:開頭的str
和小寫字母被保留 (C11 12年7月31日,13年7月31日); 在自己的代碼中使用它們作為函數名稱會導致未定義的行為。
NB。 char *p = str - 1;
通過在任何對象的邊界之外進行指針運算,也會導致未定義的行為。 (例如,假設str
恰好是地址空間中的第一個地址)。 將算法重組為不指出界限是很好的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.