簡體   English   中英

使用strstr查找四個不同的分詞

[英]Using strstr to find four different partial words

我正在尋找在文本文件中包含TP2DP3OP1OP2的字符串的一部分。

每行上都有一組不同的字符,最終會使用這三個字符,但它們永遠不會在同一行上。

找到OP2后 ,我就可以打印它了,但是它不會打印前三個。 如果我注釋掉OP2,它將找到OP1 ;如果對OP1OP2進行注釋,則會找到DP3 ,依此類推。

我不明白為什么它一旦發現就無法打印出全部四個不同的圖像。

我用兩種不同的方法之一,我strcpytemp和一個我剛打印出來的是既不工作。 稍后,我希望它在具有四種搜索類型的行上顯示在=符號的右側,但是在解決打印問題后,我將繼續進行處理。 任何幫助或原因,將不勝感激。

#include < stdio.h>
#include < stdlib.h>
#include < string.h>

#define MAX_LINE_LENGTH 150

int main(void) {

    FILE *file1, *file2;
    char parts[MAX_LINE_LENGTH+1];
    int len = strlen(parts);

    //char TP2[3] = "TP2";
    char DP3[3] = "DP3";
    char MOP1[3] = "OP1";
    //char MOP2[3] = "OP2";

    //char TP2Temp[MAX_LINE_LENGTH];
    char DP3Temp[MAX_LINE_LENGTH];
    char MOP1Temp[MAX_LINE_LENGTH];
    //char MOP2Temp[MAX_LINE_LENGTH];

    file1 = fopen("input.txt", "r");
    file2 = fopen("output2.txt", "w");

    if (file1 == NULL || file2 ==NULL) {
        exit(1);
    }

    while(fgets(parts, sizeof(parts), file1)!=NULL){
        if(parts[len -1 ] =='\n'){
            parts[len -1 ] ='\0';
        }
        //if(strstr(parts, TP2)!=NULL){
        //  strcpy(TP2Temp, parts);
        //  fprintf(file2, "%s", TP2Temp);
        //}
        if(strstr(parts,DP3)!=NULL){
            strcpy(DP3Temp, strstr(parts,DP3));
            fprintf(file2, "%s", DP3Temp);
        }
        else if(strstr(parts, MOP1)!=NULL){
            strcpy(MOP1Temp, strstr(parts,MOP1));
            fprintf(file2, "%s", MOP1Temp);
        }
        /*else if(strstr(parts, MOP2)!=NULL){
            strcpy(MOP2Temp, parts);
            fprintf(file2, "%s", MOP2Temp);
        }*/
    }

    fclose(file1);
    fclose(file2);

    return 0;
}


/*Here is the text file sample
TC_TP1[2]=1
TC_TP2[2]="9070036"
TC_TP3[2]=1
TC_TP4[2]=1
TC_TP5[2]=1
TC_TP6[2]=1
TC_TP7[2]=1
TC_DP1[2,1]=120
TC_DP2[2,1]=0
TC_DP3[2,1]=179.85
TC_DP4[2,1]=0
TC_DP5[2,1]=0
TC_MOP1[2,1]=3
TC_MOP2[2,1]=28
TC_MOP3[2,1]=0
TC_MOP4[2,1]=0
TC_TP1[3]=1
TC_TP2[3]="9005270"
TC_TP3[3]=1*/
char parts[MAX_LINE_LENGTH+1];
int len = strlen(parts);

parts未在此代碼中初始化,因此不能保證包含字符串。 即使這樣做, len也會被初始化為那個垃圾字符串的長度,這是沒有意義的,因此是無用的。

char DP3[3] = "DP3";

如果您對字符串的理解是正確的,則應該意識到這些字符串中包含四個字符。 下面的程序演示了這一點:

#include <stdio.h>
int main(void) {
    printf("sizeof \"DP3\": %zu\n", sizeof "DP3");
}

您正在讀書以學習C,對嗎? 您的書會在許多其他事情中向您解釋,因此我們不需strstrstrstr要求其操作數為字符串 ,並且字符串始終包含終止符'\\0' 您終止的'\\0'在哪里? 如何期望strstr知道DP3指向的字符串的長度?

因為令牌的長度最多為三個字節,所以您當前一次只需要讀取和存儲最多三個字節即可進行搜索(四個字節,包括上面說明的終端字節;下面的未經測試和不完整的示例); 如果您決定引入更長(或動態大小)的令牌,則此要求可能會發生變化,您的光標將需要與最長令牌一樣寬。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef unsigned char item[4];
int item_cmp(void const *x, void const *y) {
    return memcmp(x, y, sizeof (item));
}
int main(void) {
    item cursor = "",
         haystack[] = { "TP1", "OP0", "OP1", "OP2", "TP0", "DP3", "OOO" };

    size_t size  = fread(cursor, sizeof cursor - 1, 1, stdin),
           nelem = sizeof haystack / sizeof *haystack;

    int c = 0, e = !size;

    qsort(haystack, nelem, sizeof *haystack, item_cmp);

    do {
        if (bsearch(cursor, haystack, nelem, sizeof *haystack, item_cmp)) {
            printf("match found for %s\n", cursor);
        }
        memmove(cursor, cursor + 1, sizeof cursor - 1);
        if (!e) {
            c = fgetc(stdin);
            e = c < 0 && feof(stdin);
        }
        cursor[size] = e || c == '\n' ? '\0' : c;
        size -= e;
    } while (size);

    exit(0);
}

再次感謝BLUEPIXY,借助您的信息,我能夠進行所需的更改,並能夠提取找到TP2的數據,然后提取等號后的值。 我敢肯定有一種更好的方法來編寫此代碼,但是下面是我的解決方案。 我將添加一個更改,以便能夠使用任何文件名以及原因

MOP1Equal[strlen(MOP1Equal) -1] ='\0'; 

是將其放入要插入excel的csv文件的列中,並且

fprintf(file2, "\t%s", MOP1Equal+1); 

我加1是為了擺脫=號。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define MAX_LINE_LENGTH 150

int main(void) {

FILE *file1, *file2;
char parts[MAX_LINE_LENGTH+1] = "startingvaluebeforechange";

char TP2[4] = "TP2";
char DP3[4] = "DP3";
char MOP1[4] = "OP1";
char MOP2[4] = "OP2";
char Equal[2] = "=";

char TP2Temp[MAX_LINE_LENGTH];
char TP2Equal[MAX_LINE_LENGTH];

char DP3Temp[MAX_LINE_LENGTH];
char DP3Equal[MAX_LINE_LENGTH];

char MOP1Temp[MAX_LINE_LENGTH];
char MOP1Equal[MAX_LINE_LENGTH];

char MOP2Temp[MAX_LINE_LENGTH];
char MOP2Equal[MAX_LINE_LENGTH];

file1 = fopen("input.txt", "r");
file2 = fopen("output.txt", "w");

if (file1 == NULL || file2 ==NULL) {
    exit(1);
}

while(fgets(parts, sizeof(parts), file1)!=NULL){
    int len = strlen(parts);
    if(parts[len -1 ] =='\n'){
        parts[len -1 ] ='\0';
    }
    if(strstr(parts, TP2)!=NULL){
        strcpy(TP2Temp, strstr(parts,TP2));
        strcpy(TP2Equal, strstr(TP2Temp,Equal));
        TP2Equal[strlen(TP2Equal) -2] ='\0';            
        fprintf(file2, "%s", TP2Equal+2);
    }
    if(strstr(parts,DP3)!=NULL){
        strcpy(DP3Temp, strstr(parts,DP3));
        strcpy(DP3Equal, strstr(DP3Temp,Equal));
        DP3Equal[strlen(DP3Equal) -1] ='\0';
        fprintf(file2, "\t%s", DP3Equal+1);
    }
    if(strstr(parts, MOP1)!=NULL){
        strcpy(MOP1Temp, strstr(parts,MOP1));
        strcpy(MOP1Equal, strstr(MOP1Temp,Equal));
        MOP1Equal[strlen(MOP1Equal) -1] ='\0';
        fprintf(file2, "\t%s", MOP1Equal+1);
    }
    if(strstr(parts, MOP2)!=NULL){
        strcpy(MOP2Temp, strstr(parts,MOP2));
        strcpy(MOP2Equal, strstr(MOP2Temp,Equal));
        fprintf(file2, "\t%s", MOP2Equal+1);
    }
}
fclose(file1);
fclose(file2);
return 0;

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM