C:将二维数组分配给另一个数组
C: assigning 2 dimensional array to another array
int main() {
FILE *fp = fopen("fileA.txt", "r"); /* read file */
int i = 0;
char name[200][100];
char goods[200][100];
char qty[200][100];
char temp[200][100];
int x = 0;
int result;
while (!feof(fp)) {
fscanf(fp, "%[^,] , %[^,] , %s " , name[i], item[i], qty[i]); /*get file content and store in array */
if (strcmp(item[i], "Football") == 0) { /* only select Football */
temp[x][x] = qty[i];
if (x > 0) {
if (strcmp(temp[x][x], temp[x + 1][x + 1]) > 0) { /*compare who has more football qty */
result = x; /*output the person who have more football*/
}
}
x = x + 1;
}
}
printf("%s is team leader in class.\n", name[result]);
fclose(fp);
getchar();
return 0;
}
大家好,我不知道为什么结果不正确。
我想找出谁拥有更多的足球并打印出 his/her 名字。
if (strcmp(temp[x], temp[x + 1]) > 0)
上似乎有问题
我不太清楚使用指针和地址。
文本文件中的内容是:
Alice,Eating,001
Kitty,Football,006
Ben,Swimming,003
May,Football,004
我希望结果是:
Kitty is team leader in class.
谢谢。
上面的代码不清楚你想在这个代码块中做什么
if ( strcmp(temp [x], temp [x+1]) > 0 ){ /* when matches, accessing temp[x+1] results in undefined behaviour */
result = x;
}
还有为什么char *temp[200][100];
存储qty[i]
,char *temp
就够了或者你可以拿char temp[200][100];
由于要求不明确,这里有一个更好一些。
int main() {
FILE *fp= fopen("fileA.txt","r"); /* read file */
if(fp == NULL) {
/* not exist.. write something ?? */
return 0;
}
char name [200][100],goods[200][100],qty[200][100],temp[200][100];
int x = 0,result = 0, i = 0;
while ((fscanf(fp, "%[^,] , %[^,] , %s " , name[i], goods [i], qty[i])) == 3) {
if (strcmp(goods[i] , "Football") == 0){
strcpy(temp[x],qty[i]);
if ( strcmp(temp [x], temp [x+1]) > 0 ) { /* UB ? */
result = x;
x+=1;
}
}
}
printf("%s is team leader in class. \n", name[result]);
fclose(fp);
getchar();
return 0;
}
您的代码中存在多个问题:
你没有测试文件是否正常打开
您无法使用 while (!feof(fp)) {
正确解析文件。您应该迭代 fscanf()
returns 3,或者最好逐行读取输入并使用 sscanf()
.
进行解析
您没有告诉 fscanf()
要存储到目标数组中的最大字符数。这可能会导致无效输入的未定义行为。
您不会为每读一行递增 i
。输入的每一行都会覆盖前一行。
超过200行你就不检查了。在这种情况下未定义的行为。
你找到数量最多的足球迷的测试失败了:这里不需要二维数组,只需跟踪当前的最大值并在需要时更新它。
这是修改后的版本:
#include <stdio.h>
int main() {
FILE *fp = fopen("fileA.txt", "r"); /* read file */
char buf[300];
char name[200][100];
char goods[200][100];
char qty[200][100];
int i, qty, max_qty = 0, result = -1;
if (fp == NULL) {
fprintf(stderr, "cannot open file\n");
return 1;
}
for (i = 0; i < 200; i++) {
if (!fgets(buf, sizeof buf, fp))
break;
if (sscanf(buf, " %99[^,], %99[^,],%99s", name[i], item[i], qty[i]) != 3) {
fprintf(stderr, "invalid input: %s\n", buf);
break;
}
if (strcmp(item[i], "Football") == 0) { /* only select Football */
qty = atoi(qty[i]);
if (result == -1 || qty > max_qty) {
result = i; /*store the index of the person who have more football */
}
}
}
if (result < 0)
printf("no Football fan at all!\n");
else
printf("%s is team leader in class with %d in Football.\n", name[result], max_qty);
fclose(fp);
getchar();
return 0;
}
int main() {
FILE *fp = fopen("fileA.txt", "r"); /* read file */
int i = 0;
char name[200][100];
char goods[200][100];
char qty[200][100];
char temp[200][100];
int x = 0;
int result;
while (!feof(fp)) {
fscanf(fp, "%[^,] , %[^,] , %s " , name[i], item[i], qty[i]); /*get file content and store in array */
if (strcmp(item[i], "Football") == 0) { /* only select Football */
temp[x][x] = qty[i];
if (x > 0) {
if (strcmp(temp[x][x], temp[x + 1][x + 1]) > 0) { /*compare who has more football qty */
result = x; /*output the person who have more football*/
}
}
x = x + 1;
}
}
printf("%s is team leader in class.\n", name[result]);
fclose(fp);
getchar();
return 0;
}
大家好,我不知道为什么结果不正确。
我想找出谁拥有更多的足球并打印出 his/her 名字。
if (strcmp(temp[x], temp[x + 1]) > 0)
上似乎有问题
我不太清楚使用指针和地址。
文本文件中的内容是:
Alice,Eating,001
Kitty,Football,006
Ben,Swimming,003
May,Football,004
我希望结果是:
Kitty is team leader in class.
谢谢。
上面的代码不清楚你想在这个代码块中做什么
if ( strcmp(temp [x], temp [x+1]) > 0 ){ /* when matches, accessing temp[x+1] results in undefined behaviour */
result = x;
}
还有为什么char *temp[200][100];
存储qty[i]
,char *temp
就够了或者你可以拿char temp[200][100];
由于要求不明确,这里有一个更好一些。
int main() {
FILE *fp= fopen("fileA.txt","r"); /* read file */
if(fp == NULL) {
/* not exist.. write something ?? */
return 0;
}
char name [200][100],goods[200][100],qty[200][100],temp[200][100];
int x = 0,result = 0, i = 0;
while ((fscanf(fp, "%[^,] , %[^,] , %s " , name[i], goods [i], qty[i])) == 3) {
if (strcmp(goods[i] , "Football") == 0){
strcpy(temp[x],qty[i]);
if ( strcmp(temp [x], temp [x+1]) > 0 ) { /* UB ? */
result = x;
x+=1;
}
}
}
printf("%s is team leader in class. \n", name[result]);
fclose(fp);
getchar();
return 0;
}
您的代码中存在多个问题:
你没有测试文件是否正常打开
您无法使用
while (!feof(fp)) {
正确解析文件。您应该迭代fscanf()
returns 3,或者最好逐行读取输入并使用sscanf()
. 进行解析
您没有告诉
fscanf()
要存储到目标数组中的最大字符数。这可能会导致无效输入的未定义行为。您不会为每读一行递增
i
。输入的每一行都会覆盖前一行。超过200行你就不检查了。在这种情况下未定义的行为。
你找到数量最多的足球迷的测试失败了:这里不需要二维数组,只需跟踪当前的最大值并在需要时更新它。
这是修改后的版本:
#include <stdio.h>
int main() {
FILE *fp = fopen("fileA.txt", "r"); /* read file */
char buf[300];
char name[200][100];
char goods[200][100];
char qty[200][100];
int i, qty, max_qty = 0, result = -1;
if (fp == NULL) {
fprintf(stderr, "cannot open file\n");
return 1;
}
for (i = 0; i < 200; i++) {
if (!fgets(buf, sizeof buf, fp))
break;
if (sscanf(buf, " %99[^,], %99[^,],%99s", name[i], item[i], qty[i]) != 3) {
fprintf(stderr, "invalid input: %s\n", buf);
break;
}
if (strcmp(item[i], "Football") == 0) { /* only select Football */
qty = atoi(qty[i]);
if (result == -1 || qty > max_qty) {
result = i; /*store the index of the person who have more football */
}
}
}
if (result < 0)
printf("no Football fan at all!\n");
else
printf("%s is team leader in class with %d in Football.\n", name[result], max_qty);
fclose(fp);
getchar();
return 0;
}