使用C的字符串的垃圾值

时间:2013-05-03 04:11:36

标签: c

我不确定我的程序发生了什么,但我基本上有一个函数试图从文件中读取一堆字符串并将其传递回main进行进一步处理。这是我的代码:

char* readFile(FILE* fpFile)
{
//  Local Declaration
char *ptr;
char temp[1000];

//  Statment
fgets(temp, sizeof(temp), fpFile);
ptr = temp;

return ptr;
}// readFile

一旦函数将指针传回main,就会出现问题。我尝试打印字符串,但我只得到前几行正确并且在垃圾之后。另外,如果我要在函数ptr中打印readFile,它打印得非常好,并且传回主打印的指针也打印得很好。有什么东西我错过了吗?任何帮助将不胜感激。

这是我得到的输出

2000 1990
New York-No. NJ; 21199865 19549649
Los Angeles area; 16373645 14531629
Chicago area; 9157540 8239820
Washington-Baltimore; 7608070 6727050
San Francisco area; 7039362 6253311
Philadelphia-Atlantic City area; 6188463 5892937
Boston\240\365\277_\377

应该有两倍的投入量,但它的停止时间只有四分之一。

2 个答案:

答案 0 :(得分:4)

char temp[1000];是本地的。当控件超出readFile()时,该内存可能被分配给其他目的。有两种方法,存储可以是全局数组,也可以使用malloc()动态分配内存。

char* readFile(FILE* fpFile)
{
//  Local Declaration
char *ptr = malloc(1000);

//  Statment
fgets(ptr, 1000, fpFile);

return ptr;
}// readFile

答案 1 :(得分:0)

该变量仅保证在函数范围内。这包括您为temp分配的数据。之后,任何事情都会发生在1000个细胞上。

你的功能还有第二件事: 它似乎正在包装已经提供目标功能的现有功能。

当时

char* readFile(FILE* fpFile)
{
//  Local Declaration
char *ptr;
char temp[1000];

//  Statment
fgets(temp, sizeof(temp), fpFile);
ptr = temp;

return ptr;
}// readFile

作品

char* readFile(FILE* fpFile, char* ptr, int n)
{
//  Statment
fgets(ptr, sizeof(char)*n, fpFile);
ptr = temp;
return ptr;
}// readFile
void fun()
{
//somehow File*
int num = 1000;
char* pointer = (char*) malloc(sizeof(char)*num);
pointer = readFile(file,pointer,num);
}

应该

void fun()
{
//somehow File*
int num = 1000;
char* pointer = (char*) malloc(sizeof(char)*num);
fgets(file,pointer*sizeof(char));
}