Недавно я написал простую программу для изменения строки, моя программа просто принимает входную строку от пользователя, а затем меняет ее. Все это делается с помощью 2 указателей. Что касается безопасности указателя в моей программе, я написал функцию для дублирования строки-источника. Эта функция выделяет память для новой строки (такой же длины), а затем копирует символ 1-на-1.
Моя проблема в том, когда я запускаю эту программу, хотя она делает то, что мне нужно, она печатает какой-то таинственный дополнительный вывод. Он делает это каждый раз, прежде чем принимать входные данные от пользователя. Это то, что происходит, когда я запускаю программу.
C:\Users\0xEDD1E\Desktop\revstr>revstr.exe
[C]
[.]
[revstr.exe]
hello
[hello]
olleh
здесь последние три строки: Input и Output, It OK, Проблема в первых трех строках
[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 такой ошибки нет.
Мой инстинкт говорит мне, что эта ошибка должна что-то делать с указателями, используемыми в функциях
UPDATE: я пробовал fflush(stdout)
, но это не помогло
В чем причина этой ошибки (или плохого поведения), может кто-нибудь объяснить причину?