C - char 数组的内容意外更改

标签 c arrays function pointers file-io

我有一些代码打算在更大的程序中使用,它获取用户的输入,然后将该输入写入文件,但是数据在写入文件之前/期间以某种方式丢失。

#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);    
}

无论输入如何,输出函数中的 print 语句都会输出与此图像类似的内容

enter image description here

因此,它会在按预期方式使用这些内容之前直接打印所需的“文本”内容,然后将这些内容替换为空,并仅在文本文档中写入换行符,然后在下一个打印语句中文本变成一个奇怪的重音字符(每次程序运行时都会有所不同)。

所以我相信我误用了指针,或者我以一种奇怪的方式从函数返回 char 数组。

最佳答案

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);
}

关于C - char 数组的内容意外更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33073630/

相关文章:

c - 用指针修改结构体数组

c - 确定子串的大小

javascript - 在数组项之间进行操作

Java - 使用二维数组创建按钮网格

c - putwchar() 无法显示 wchar_t 变量

c - 有没有办法从 bash 脚本中执行编译后的 C 代码?

sql - 将 postgresql 数组解包成行

C++包含一个 ".h"文件,函数重复混淆

java - 是否建议使用java字符串作为方法间通信的唯一模式

在调用已知会检查参数本身的函数之前检查参数