所以我试图做这个挑战: http://www.reddit.com/r/dailyprogrammer/comments/1sob1e/121113_challenge_144_easy_nuts_bolts/
我想使用文本文件进行输入。 如果我将我使用的单独函数的内容复制到main中,那么我可以使用的代码,但是在调用readall或compare函数之后它似乎没有运行任何东西。以下是我到目前为止的情况:
#include<stdio.h>
#include<stdlib.h>
//variable declarations
int i;
int n;
struct item *prices;
//function declarations
void readall();
int compare(int i);
int fail();
//structure definitions
struct item{
char *name;
int price;
};
//main
int main(int argc,char *argv[]){
if(fail()){
printf("Input not found\n");
return 1;
}
else{
readall();
for(i=0;i<n-1;i++){
if(compare(i)){
printf("%s\n",prices[i].name); //not added price change yet
}
}
}
free(prices);
return 0;
}
//functions
void readall(){
FILE *input = fopen("input.txt","r");
int n=0;
fscanf(input,"%u",&n);
struct item prices[2*n-1];
malloc(sizeof(prices));
for(i=0;i<2*n;i++){
fscanf(input,"%ms",&prices[i].name);
fscanf(input,"%u",&prices[i].price);
}
fclose(input);
}
int fail(){
FILE *input = fopen("input.txt","r");
fclose(input);
if(input==NULL){
return 1;
}
else{
return 0;
}
}
int compare(int i){
if(prices[i].price==prices[i+n].price){
return 1;
}
else{
return 0;
}
return 2;
}
在valgrind下运行的旁注中,我可以看到我显然没有正确处理记忆,因此任何关于这一点和/或任何其他建设性批评的提示都会受到赞赏。
答案 0 :(得分:3)
您的readall功能错误。你正在做的是在堆栈上创建一个数组,然后在堆上mallocing一个单独的数组,它没有名字,因此从不使用和泄露。尝试
Prices = malloc(sizeof(item) * n);
答案 1 :(得分:2)
我看到两个直接的问题:
prices
数组分配在堆栈和随后的数组中
使用malloc()
毫无意义。使用这样的东西:
item* prices = malloc ((2*n-1) * sizeof(struct item));
在readall()
的范围内,您可以定义一个变量n
阴影同名的全局变量。只有本地n
使用fscanf()
填充。然而,后来对compare()
的调用,
访问尚未初始化的全局n
。
您应该尝试为变量赋予有意义的名称
比i
,n
或x
。至少对于带有a的变量这样做
超过几行代码的有意义的生命周期。 (在我看来,
使用单字符变量名称对于简单循环是可以的。)