int main(int argc, char **argv) {
char *input = "input.txt";
int *account;
char **name;
float *balance;
int count;
int check;
if (argc < 4 || argc > 4) {
printf("Insufficient arguments. Check your command line arguments\n");
return 1;
}
count = atoi(*(argv + 2));
name = malloc(sizeof(char) * 20 * count);
account = malloc(sizeof(int) * count);
balance = malloc(sizeof(float) * count);
check = load_data(input, name, account, balance, count);
if (check == 0) {
printf("File cannot be open\n");
}
print_data(name, account, balance, count);
free(name);
return 0;
}
//load data from input file the according arrays
int load_data(char *input, char **name, int *acct, float *amt, int n) {
int *a = acct;
float *b = amt;
FILE *file = fopen("input.txt", "r");
int i;
if (file == NULL) {
return 0;
} else {
for (i = 0; i < 9; i++, acct++, amt++) {
fscanf(file, "%s %d %f", *(name + i), acct, amt);
}
}
fclose(file);
acct = a; //return pointer to original position
amt = b;
return 1;
}
//print data from arrays
void print_data(char **name, int *acct, float *amt, int n) {
int i;
for (i = 0; i < n; i++) {
printf("%-10s%-13s%s\n", "Name", "Account No.", "Amount");
printf("%-10s%-13d%7.2f\n", *(name + i), *(acct + i), *(amt + i));
}
}
我有这个load_data
函数,它假设从文件中读取并将数据值存储在不同的指针中,但由于某种原因,当我使用print_data
函数打印出来时,指针包含所有null和0? (请使用指针算术而不是数组回答)
答案 0 :(得分:1)
我希望你在调用函数之前没有正确地准备数组......下面的main函数将适用于你的代码:
int main(int argc, char* argv[]) {
int n = 10;
char ** name = malloc(n * sizeof(char*));
int* acct = malloc(n * sizeof(int));
float* amt = malloc(n * sizeof(float));
for (int i = 0; i < n; i++) {
// this is allocating some space for each line
// this is quite bad you should range check.
name[i] = malloc(256);
}
load_data("", name, acct, amt, n);
print_data(name, acct, amt, n);
// TODO: free everything
}
load_data
中的:a
和b
不是必需的,amt
和acct
是“按值传递”,无需恢复他们的函数末尾的值。也就是说,当此函数仅返回“指向”的值时,将丢弃所有参数中的值。
示例input.txt文件:
Adam 1 900.9
Daniel 2 800.8
Joe 3 700.7
Foo 4 600.6
Bar 5 500.5
Alice 6 400.4
Bob 7 300.3
Nick 8 200.2
Eve 9 100.1
稍微改变你的代码后(见下文),上面的输入文件确实有效,这是我得到的输出:
$ ./test 5 5 5
Name Account No. Amount
Adam 1 900.90
Name Account No. Amount
Daniel 2 800.80
Name Account No. Amount
Joe 3 700.70
Name Account No. Amount
Foo 4 600.60
Name Account No. Amount
Bar 5 500.50
根据您在问题中提供的功能更新主要功能:
int main(int argc, char **argv) {
char *input = "input.txt";
int *account;
char **name;
float *balance;
int count;
int check;
int i;
if (argc < 4 || argc > 4) {
printf("Insufficient arguments. Check your command line arguments\n");
return 1;
}
count = atoi(*(argv + 2));
name = malloc(sizeof(char *) * count);
for (i = 0; i < count; i ++) {
*(name+i) = malloc(20);
}
account = malloc(sizeof(int) * count);
balance = malloc(sizeof(float) * count);
check = load_data(input, name, account, balance, count);
if (check == 0) {
printf("File cannot be open\n");
}
print_data(name, account, balance, count);
free(balance);
free(account);
for (i = 0; i < count; i++) {
free(*(name+i));
}
free(name);
return 0;
}
...也在load_data
我将i < 9
更改为i < n
。