我是指针的新手,我正在尝试实现一个简单的代码,我在其中读取和写入一个数组,并且我还搜索两个给定索引之间的最小元素。 由于某种原因,write()函数打印大值(我猜它们是存储值的位置)。我运行poz_minVal函数时也会收到SIGSECV。 我知道这是一个不起眼的问题,但任何帮助都会非常感激!
代码如下:
#include<stdio.h>
#include<stdlib.h>
int read(int *v, FILE *f){
int i,length;
fscanf(f,"%d",&length);
v = (int *)malloc(length*sizeof(int));
for(i=0;i<length;++i)
fscanf(f,"%d",v+i);
return length;
}
void write(int *v, int length, FILE *g){
int i;
for(i=0;i<length;++i)
fprintf(g,"%d ",*(v+i));
fprintf(g,"\n\n");
}
int poz_valMin(int *v, int length,int left,int right){
int k,mini = *v; //set mini as the 1st element in v
for(k=left;k<right;++k)
if(*(v+k) < mini)
mini = *(v+k);
return mini;
}
int main(){
FILE *f = fopen("datein.txt","r");
FILE *g = fopen("dateout.txt","w");
int *v, n = read(v,f);
write(v,n,g);
fprintf("The minimum value between the indexes 2 and 4 is: %d.\n\n",poz_valMin(v,n,2,4));
return 0;
}
答案 0 :(得分:3)
无论barak manos
所说的是对的,但让我指出另一种定义读取功能的方法。
int * read(FILE *f){
int *v,length;
fscanf(f,"%d",&length);
v = (int *)malloc(length*sizeof(int));
for(i=0;i<length;++i)
fscanf(f,"%d",v+i);
return v;
}
然后在主要你应该写v = read(f);
这看起来很干净,简化了理解。
提示:
一旦你发现写入产生垃圾,你应该打印出数组v,你可能已经发现了错误!!
答案 1 :(得分:2)
功能read
应该int** v
,并指定*v = ...
。
更改函数内的输入参数不会影响函数外部的参数值。
答案 2 :(得分:1)
//int read(int *v, FILE *f) //<-- in this case v will be treated as local variable inside read() and not the parameter passed from main.
int read(int **v, FILE *f)
{
int i,length;
fscanf(f,"%d",&length);
//v = (int *)malloc(length*sizeof(int));
int *arr = (int *)malloc(length*sizeof(int));
for(i=0;i<length;++i)
//fscanf(f,"%d",v+i);
fscanf(f,"%d",arr+i);
*v = arr; //now you are actually assigning the allocated memory to main::v
return length;
}
read(&v,f); //call read like this.
答案 3 :(得分:1)
以下代码:
你应养成使用main()
函数(在那些具有main()
函数的文件中)作为列出的第一个函数的习惯,然后对每个函数使用适当的'prototype'语句子功能
建议使用size_t
来表示绝对不能为负的值。
#include <stdio.h> // fopen(), fclose(),
#include <stdlib.h>
size_t read( int **v, FILE *f);
void write( int *v, size_t length, FILE *g );
int poz_valMin( int *v, int left, int right );
int main( void )
{
FILE *f = fopen("datein.txt","r");
if( !f )
{
perror( "fopen for read of datain.txt failed" );
exit( EXIT_FAILURE );
}
// implied else, fopen successful
FILE *g = fopen("dateout.txt","w");
if( !g )
{
perror( "fopen for write to dataout.txt failed" );
fclose( f ); // cleanup
exit( EXIT_FAILURE );
}
// implied else, fopen for output successful
int *v;
size_t n = read(&v,f);
write(v,n,g);
fprintf( stdout,
"The minimum value between the indexes 2 and 4 is: %d.\n\n",
poz_valMin(v, 2, 4));
free( v );
fclose( f );
fclose( g );
}
size_t read(int **v, FILE *f)
{
//int i;
size_t length;
if( 1 != fscanf(f,"%lu",&length) )
{
perror( "fscanf failed" );
exit( EXIT_FAILURE );
}
// implied else, fscanf successful
*v = malloc(length*sizeof(int));
if( !v )
{
perror( "malloc failed" );
fclose( f );
exit( EXIT_FAILURE );
}
// implied else, malloc successful
for(size_t i=0; i<length; ++i)
{
if( 1 != fscanf(f,"%d",(*v)+i) )
{
perror( "fscanf for array values failed" );
free( *v );
fclose( f );
exit( EXIT_FAILURE );
}
// implied else, fscanf successful
}
return length;
}
void write(int *v, size_t length, FILE *g)
{
//int i;
for( size_t i=0; i<length; ++i )
fprintf(g,"%d ",*(v+i));
fprintf(g,"\n\n");
}
int poz_valMin( int *v, int left, int right )
{
int k;
int mini = *v; //set mini as the 1st element in v
for(k=left; k<right; ++k)
if(*(v+k) < mini)
mini = *(v+k);
return mini;
}