2015-10-12 1 views
-1

У меня есть код, предназначенный для использования в гораздо более крупной программе. Он получает вход пользователя, а затем должен записывать этот вход в файл. Однако данные как-то теряются непосредственно перед/во время записи в файл. неC - Неожиданно изменяется значение массива символов

#include <stdio.h> 
char *input(); 
void output(char text[1000]); 
int main() 
{ 
    char text[1000]={'\0'}, *textPtr; 
    textPtr=text; 
    textPtr=input(); 
    output(textPtr); 
} 

char *input() 
{ 
    char text[1000], *textPtr=text; 
    textPtr=text; 
    fflush(stdin);//Clears the newline character left by any prevoius scanf statements 
    scanf("%[^\n]s",textPtr); 
    return textPtr; 
} 

void output(char text[1000]) 
{ 
    FILE *file; 
    printf("\nText before file statement:\n"); 
    printf("%s\n",text); 
    //For some reason this line seems to trigger a change in 'text' 
    file=fopen("output.txt","a"); 
    printf("\nText after file statement:\n"); 
    printf("%s\n",text);  
    fprintf(file,"%s\n",text); 
    fclose(file);  
    printf("\nText after write and close statement:\n"); 
    printf("%s\n",text);  
} 

отпечатке заявление в выходном то выходной функции, аналогичном это изображение независимо от того, входной

enter image description here

Так печатает желательное содержание «текст» непосредственно перед тем содержанием используется в предполагаемый путь, он затем заменяет это содержимое ничем и записывает только разрыв строки в текстовый документ, а затем в следующем заявлении на печать текст становится одним странным акцентированным символом (изменяется каждый раз, когда программа запускается).

Так что я верю, что у меня есть неправильно используемые указатели, или я возвращаю массив символов из функции странным образом.

+0

Вы должны также проверить возвращаемое значение 'fopen'. – pzaenger

+2

Возможный дубликат [Возврат указателя на автоматическую переменную] (http://stackoverflow.com/questions/1224042/returning-a-pointer-to-an-automatic-variable) –

+0

'fflush (stdin);' invokes undefined поведение, он не определен для работы для входных потоков. – Lundin

ответ

0

textPtr=input(); вернуть новый указатель на стек, который освобождается при возврате функции input, а затем эту память (стек) можно использовать снова. Чтобы исправить это, вы должны пройти textPtr как параметры input

input(textPtr);//the call 

input(char * textPtr){//the function 
    fflush(stdin);//Clears the newline character left by any prevoius scanf statements 
    scanf("%[^\n]s",textPtr); 
}