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;
}
...