簡體   English   中英

為什么printf()在Windows上打印這個神秘的額外文本?

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

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