最近,我编写了一个简单的程序来反转字符串,我的程序只接受用户的输入字符串,然后反转它。这全部用2个指针完成。关于程序中的指针安全性,我编写了一个复制给定字符串的函数,该函数为新的(相同长度)字符串分配内存,然后按1比1的方式复制字符。

我的问题是,当我运行此程序时,尽管它可以满足我的需要,但它会打印出一些神秘的额外输出。在接受用户输入之前,它每次都会执行此操作。这是我运行程序时发生的情况。

C:\Users\0xEDD1E\Desktop\revstr>revstr.exe
[C]
[.]
[revstr.exe]
hello
[hello]
olleh

这最后三行是输入和输出,可以,问题在前三行
[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(64bit)上测试过,在Ubuntu中没有这样的错误。

我的直觉告诉我,此错误与函数中使用的指针有关

更新:我尝试了fflush(stdout),但没有帮助

该错误(或行为不当)背后的原因是什么,有人可以解释原因吗?

最佳答案

可能是系统的C库还定义了一个函数strdup,程序启动时的一些代码会调用该函数。然后,链接器将这些调用链接到您的strdup函数而不是系统函数。

为避免这种情况,请勿为此函数命名strdupstr:保留以str开头的名称和一个小写字母(C11 7.31.12、7.31.13);在您自己的代码中将它们用作函数名称会导致未定义的行为。

注意char *p = str - 1;通过在任何对象的边界之外执行指针算术也会导致未定义的行为。 (例如,假设str是否恰好是地址空间中的第一个地址)。最好重新构造算法以使其不超出范围。

关于c - 为什么在Windows上printf()打印此神秘的多余文本?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36811599/

10-08 22:04
查看更多