strcmp() 函数仅适用于第一次迭代 C
strcmp() function only works on first iteration C
我需要制作一个程序,输出包含匹配字符串“target”的所有行,并计算匹配次数和总成本,
问题是无论是否存在匹配项,for 循环都会在第一次迭代时停止
我试过使用 strstr() 而不是 strcmp() 并且它有效,但由于这是学校作业,我不能使用 strstr()
#include<stdio.h>
#include<string.h>
struct data{
char product[100];
char name[100];
int price;
};
int main(){
FILE *f;
f = fopen("Customers.txt", "r");
int x;
scanf("%d",&x);
struct data arr[x];
for(int i=0;i<x;i++){
fscanf(f,"%[^,], %[^,], %d",arr[i].product,arr[i].name,&arr[i].price);
}
char target[100];
int res;
int count=0;
int total=0;
scanf("%s",target);
for(int j=0;j<x;j++){
res=strcmp(arr[j].product,target);
if(res==0){
printf("%s, %s, %d",arr[j].product,arr[j].name,arr[j].price);
count++;
total = total + arr[j].price;
}
else{
continue;
}
}
printf("\nTotal Buyers: %d\n",count);
printf("Total Amount: %d\n",total);
}
文件:
Gem, Alice, 2000
Gold, Bob, 3000
Gem, Cooper, 2000
输入:
3
(文件中的行数)
Gem
(目标)
预期输出:
Alice 2000
Cooper 2000
fscanf
格式字符串错误,应该是:
"%[^,], %[^,], %d\n"
注意最后的 \n
。否则,\n
(新行)将不会被吸收,下一个字符串读取的第一项将以 \n
.
开头
或者更好:使用这种格式字符串:
" %[^,], %[^,], %d"
注意开头的space。使用该格式字符串,所有前导和尾随白色space,包括换行符,都将被吸收。
此外,您绝对需要检查 fopen
是否失败,在您的情况下显然没有,但是如果由于某种原因无法打开文件,并且您没有进行任何检查,则后续操作f
不会有好下场。
所以你至少需要这个:
...
f = fopen("Customers.txt", "r");
if (f == NULL)
{
printf("Can't open file\n");
return 1;
}
...
我需要制作一个程序,输出包含匹配字符串“target”的所有行,并计算匹配次数和总成本,
问题是无论是否存在匹配项,for 循环都会在第一次迭代时停止
我试过使用 strstr() 而不是 strcmp() 并且它有效,但由于这是学校作业,我不能使用 strstr()
#include<stdio.h>
#include<string.h>
struct data{
char product[100];
char name[100];
int price;
};
int main(){
FILE *f;
f = fopen("Customers.txt", "r");
int x;
scanf("%d",&x);
struct data arr[x];
for(int i=0;i<x;i++){
fscanf(f,"%[^,], %[^,], %d",arr[i].product,arr[i].name,&arr[i].price);
}
char target[100];
int res;
int count=0;
int total=0;
scanf("%s",target);
for(int j=0;j<x;j++){
res=strcmp(arr[j].product,target);
if(res==0){
printf("%s, %s, %d",arr[j].product,arr[j].name,arr[j].price);
count++;
total = total + arr[j].price;
}
else{
continue;
}
}
printf("\nTotal Buyers: %d\n",count);
printf("Total Amount: %d\n",total);
}
文件:
Gem, Alice, 2000
Gold, Bob, 3000
Gem, Cooper, 2000
输入:
3
(文件中的行数)
Gem
(目标)
预期输出:
Alice 2000
Cooper 2000
fscanf
格式字符串错误,应该是:
"%[^,], %[^,], %d\n"
注意最后的 \n
。否则,\n
(新行)将不会被吸收,下一个字符串读取的第一项将以 \n
.
或者更好:使用这种格式字符串:
" %[^,], %[^,], %d"
注意开头的space。使用该格式字符串,所有前导和尾随白色space,包括换行符,都将被吸收。
此外,您绝对需要检查 fopen
是否失败,在您的情况下显然没有,但是如果由于某种原因无法打开文件,并且您没有进行任何检查,则后续操作f
不会有好下场。
所以你至少需要这个:
...
f = fopen("Customers.txt", "r");
if (f == NULL)
{
printf("Can't open file\n");
return 1;
}
...