Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 当读取具有多个条件的数据时,如何在函数中保持while循环?_C_While Loop_Conditional Statements - Fatal编程技术网

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);