C 当读取具有多个条件的数据时,如何在函数中保持while循环?
此代码为我提供了异常数据,因为我使用了C 当读取具有多个条件的数据时,如何在函数中保持while循环?,c,while-loop,conditional-statements,C,While Loop,Conditional Statements,此代码为我提供了异常数据,因为我使用了!pinFound。所以我想让它把细节弄清楚。这意味着,如果我想要pinFound结果,那么它应该只给我pinFound结果,或者如果我想要!pinFound结果然后它应该只给我!pinFound结果 我不想同时打印两个结果,而且我有多个函数可以读取数据。所以我不想在主函数中重复while(fgets(…)。 #include <stdio.h> #include <stdlib.h> #include <string.h>
!pinFound
。所以我想让它把细节弄清楚。这意味着,如果我想要pinFound
结果,那么它应该只给我pinFound
结果,或者如果我想要!pinFound
结果然后它应该只给我!pinFound
结果
我不想同时打印两个结果,而且我有多个函数可以读取数据。所以我不想在主函数中重复while(fgets(…)。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define STRING_LEN 200
int i;
char line[STRING_LEN], *lineOne = NULL, *numbers[5], pinFind[STRING_LEN], *pinFound = NULL;
int find(FILE * fname, char *findPin){
while(fgets(line, STRING_LEN, fname)){
lineOne = strtok(line, "\n");
numbers[0] = strtok(lineOne, ",");
for(i = 1; i < 5; i++)
numbers[i] = strtok(NULL, ",");
pinFound = strstr(numbers[2], findPin);
if(!pinFound)
return line;
}
}
int main(){
FILE * fp1 = fopen("file.csv", "r");
printf("Enter the pin code: ");
scanf("%s", pinFind);
find(fp1, pinFind);
for(i=0; i<5; i++)
printf("%s\n", numbers[i]);
return 0;
}
#包括
#包括
#包括
#定义字符串\u LEN 200
int i;
字符行[STRING_LEN],*lineOne=NULL,*number[5],pinFind[STRING_LEN],*pinFind=NULL;
int find(文件*fname,字符*findPin){
while(fgets(line,STRING_LEN,fname)){
lineOne=strtok(第“\n”行);
数字[0]=strtok(第一行,“,”);
对于(i=1;i<5;i++)
数字[i]=strtok(空,“,”);
pinFound=strstrstr(数字[2],findPin);
如果(!pinFound)
回流线;
}
}
int main(){
FILE*fp1=fopen(“FILE.csv”,“r”);
printf(“输入pin码:”);
scanf(“%s”,pinFind);
查找(fp1,pinFind);
对于(i=0;i如果我正确地阅读了您的问题,您希望从其余的处理中提取文件迭代逻辑
使您能够实现这一目标的基本变化是:
#include <stdbool.h>
// parse next line, return true if line was parsed
bool nextLine(FILE * fname, char *findPin)
{
if (fgets(line, STRING_LEN, fname))
{
lineOne = strtok(line, "\n");
numbers[0] = strtok(lineOne, ",");
for (int i = 1; i < 5; i++)
numbers[i] = strtok(NULL, ",");
pinFound = strstr(numbers[2], findPin);
return true;
}
else
{
return false;
}
}
对于家庭作业项目,这或多或少会起到作用,但我建议将nextLine
调用之间的状态封装在一个单独的结构中,而不是将其保持为全局。将所有这些变量设置为全局是一个坏主意,但将I
设置为全局变量是一个非常危险的坏主意 “此代码为我提供了异常数据,因为我使用了!pinFound
”-这是相当不清楚的。什么异常数据?为什么使用!pinfind
?您期望什么输出,用于什么精确输入?顺便说一句,将所有这些变量设置为全局变量是个坏主意,但将i
设置为全局变量尤其危险。@Groo异常数据意味着在其中找不到输入的pin码的数据。@Groo i h我一直在努力解决这个问题很久了,我是CAlso的新手,返回行
(其中行
是一个字符串)在声明返回int
的函数中?函数真正应该返回的是什么?以及main
函数将如何处理返回的值?谢谢!另一个问题是为什么i
是危险的?如果您在整个代码中不断更改全局状态,每个看似简单的函数调用ike可能会改变任何后续函数调用的结果。这使得一旦它增长了一点,就很难确保程序的正确性,因为函数的结果不会完全由它的参数(纯函数)决定。如果i
是全局的,那么像for(i=0;i<5;i++){doSomething()这样看似无辜的代码;}
允许doSomething
函数在循环中更改i
并中断内容。如果您只对其进行范围(for(int i=0;…)
),您就省去了麻烦。
FILE * fp1 = fopen("file.csv", "r");
printf("Enter the pin code: ");
scanf("%s", pinFind);
while (nextLine(fp1, pinFind))
{
// if you are here, line was parsed, so
// check the value of 'pinFound'
if (pinFound)
doSomething(numbers);
else
doSomethingElse(numbers);
}
fclose(fp1);