无法在c中的while循环期间/之后清除字符串

时间:2013-01-12 01:56:21

标签: c string if-statement while-loop

我有一个代码,用于扫描目录中的所有文件以获取目标词,并将其打印到新文件中。现在的问题是在while循环读取文件并将变量存储到字符串(例如customer)之后,如果正在读取的下一个文件没有目标字,它仍然显示存储在前一个字符串中的结果文件。我的目标是,如果当前文件没有目标词,则显示“N / A”。

我已经尝试了几种方法来清除while循环的结尾或开头的字符串,但是它们中的大多数都没有工作只会给我一个coredump错误。任何帮助都会受到欢迎!

代码(缩短以便于阅读):

int main(int argc, char** argv)
{   
    char           directory[100];
    char           buff[100];
    char           delims[] = " :=";
    char*          result = NULL;
    char*          customer;
    char*          device;
    char*          buffer;
    int            i = 0;
    DIR*           FD;
    struct dirent* in_file;
    int            c = 0;

    printf("Enter directory:");                                   
    scanf("%s",directory);

    FILE* ft = fopen("workorderlist.csv", "w");    /* Open file to write to*/
    if (ft == NULL)
    {
        puts("Cannot open target file");
        exit(1);
    }

    fprintf (ft, "Work Order,Customer,Device,Test_Prog,Software,DUT_board_id,Corl box\n");

    /* Open Directory */
    if (NULL == (FD = opendir(directory))) 
    {
        puts("Cannot open directory");

        return 1;
    }

    while ((in_file = readdir(FD))) 
    {
        if (!strcmp (in_file->d_name, "."))
        {
            continue;
        }

        if (!strcmp (in_file->d_name, ".."))    
        {
            continue;
        }

        /* Open files to read from  */  
        buffer = (char*)malloc(100);
        sprintf(buffer, "%s/%s", directory, in_file->d_name);

        size_t len = strlen(buffer);
        if (len >= 4 && memcmp(buffer + len - 4, ".wor", 4) == 0)   /* checks if file ends with .wor */
        {
            FILE* fs = fopen(buffer, "r");       /* open file to read */

            if (fs == NULL)
            {
                puts("Cannot open source file");

                return 1;
            }

            /* Scanning each file for targeted words: */
            while (fgets(buff, 100, fs) != NULL)      
            {   
                result = strtok( buff, delims );          
                while (result != NULL)
                {   
                    if ((strcmp(result, "Customer") == 0))
                    { 
                        result = strtok(NULL,delims);  
                        customer = (char*)malloc((strlen(result)+1)*sizeof(char));
                        strcpy(customer, result);
                        for (i = 0; i < strlen(customer) + 1; i++)
                        {
                            if (customer[i] == '\n')
                            {
                                break;
                            }
                        }

                        customer[i] = ' ';
                    }

                    if (strcmp(result, "device") == 0)
                    { 
                        result = strtok(NULL, delims);  
                        device = (char*)malloc((strlen(result) + 1) * sizeof(char));
                        strcpy(device, result);
                        for (i = 0; i < strlen(device) + 1; i++)
                        { 
                            if(device[i] == '\n')
                            {
                                break;
                            }
                        }

                        device[i] = ' ';
                    }

                    result = strtok(NULL,delims);
                }   
            }

            if (customer == '\0')
            {
                customer = "N/A";
            }

            if (device == '\0')
            {
                device = "N/A";
            }

            fprintf(ft, "%s,%s,%s,%s,%s,%s,%s\n", 
                    in_file->d_name, customer, device, testprog, 
                    software, dutboardid, corlbox);

             printf(in_file->d_name);
             printf("\n");
             fclose (fs) ;
             c++;
        }
    }

    printf("Total Workorders Found: %d (Info saved to workorderlist.csv)\n", c);
    fclose(ft);

    return 0;
}

1 个答案:

答案 0 :(得分:1)

首先,客户/设备是字符串。你不应该做==比较。例如,您可以比较字符串的第一个字符:device[0] == '\0'; 你应该在循环开始之前进行字符串初始化。 您可以通过使用具有已知值的strcpy或任何其他字符串操作函数来实现此目的。在循环之前用于初始化字符串的值是您稍后将使用strcmp或类似函数测试的值。 与int或任何其他C数据类型一样,但您需要操作函数。

顺便问一下,你有没有在这里的问题中发布你的阅读文件循环?

希望这有帮助。