Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.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/3/arrays/12.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 使用strstr查找四个不同的部分词_C_String - Fatal编程技术网

C 使用strstr查找四个不同的部分词

C 使用strstr查找四个不同的部分词,c,string,C,String,我希望在文本文件中找到包含TP2、DP3、OP1或OP2的字符串的一部分 MOP1Equal[strlen(MOP1Equal) -1] ='\0'; 每一行上都有一组不同的字符,最终会使用这三个字符,但它们永远不会在同一行上 MOP1Equal[strlen(MOP1Equal) -1] ='\0'; 一旦找到OP2,我就可以让它打印出来,但它不会打印前面的三个。如果我注释掉OP2它会找到OP1,如果我对OP1和OP2进行注释,它会找到DP3,依此类推 MOP1Equal[strlen

我希望在文本文件中找到包含TP2DP3OP1OP2的字符串的一部分

MOP1Equal[strlen(MOP1Equal) -1] ='\0'; 
每一行上都有一组不同的字符,最终会使用这三个字符,但它们永远不会在同一行上

MOP1Equal[strlen(MOP1Equal) -1] ='\0'; 
一旦找到OP2,我就可以让它打印出来,但它不会打印前面的三个。如果我注释掉OP2它会找到OP1,如果我对OP1OP2进行注释,它会找到DP3,依此类推

MOP1Equal[strlen(MOP1Equal) -1] ='\0'; 
我不明白为什么它不能打印出所有四个不同的一次发现

MOP1Equal[strlen(MOP1Equal) -1] ='\0'; 
我使用了两种不同的方法,一种是将strcpy转换成temp,另一种是按原样打印,两种方法都不起作用。稍后,我希望它打印到带有四种搜索类型的行上的
=
符号的右侧,但在修复打印问题后,我将处理该问题。如有任何帮助或原因,将不胜感激

#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*/
MOP1Equal[strlen(MOP1Equal) -1] ='\0'; 
#包括
#包括
#包括
#定义最大线长度150
内部主(空){
文件*file1,*file2;
字符部分[最大行长度+1];
int len=strlen(零件);
//字符TP2[3]=“TP2”;
字符DP3[3]=“DP3”;
char MOP1[3]=“OP1”;
//char MOP2[3]=“OP2”;
//字符TP2Temp[最大行长度];
字符DP3Temp[最大行长度];
char MOP1Temp[最大行长度];
//char MOP2Temp[最大线长度];
file1=fopen(“input.txt”,“r”);
file2=fopen(“output2.txt”,“w”);
if(file1==NULL | | file2==NULL){
出口(1);
}
while(fgets(parts,sizeof(parts),file1)!=NULL){
如果(部分[len-1]='\n'){
部分[len-1]='\0';
}
//如果(strstr(零件,TP2)!=NULL){
//strcpy(TP2Temp,零件);
//fprintf(文件2,“%s”,TP2Temp);
//}
如果(strstr(零件,DP3)!=NULL){
strcpy(DP3Temp,strstr(零件,DP3));
fprintf(文件2,“%s”,DP3Temp);
}
否则如果(strstr(零件,MOP1)!=NULL){
strcpy(MOP1Temp,strstr(零件,MOP1));
fprintf(文件2,“%s”,MOP1Temp);
}
/*否则如果(strstr(零件,MOP2)!=NULL){
strcpy(MOP2Temp,零件);
fprintf(文件2,“%s”,MOP2Temp);
}*/
}
fclose(文件1);
fclose(文件2);
返回0;
}
/*这是文本文件示例
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*/
parts
在此代码中未初始化,因此不能保证包含字符串。即使是这样,
len
也会被初始化为垃圾字符串的长度,这是没有意义的,因此是无用的

char DP3[3] = "DP3";
MOP1Equal[strlen(MOP1Equal) -1] ='\0'; 
如果您对字符串的理解是正确的,那么您应该意识到这些字符串中有四个字符。以下程序演示了这一点:

#include <stdio.h>
int main(void) {
    printf("sizeof \"DP3\": %zu\n", sizeof "DP3");
}
MOP1Equal[strlen(MOP1Equal) -1] ='\0'; 

再次感谢BLUEPIXY,根据您的信息,我能够进行所需的更改,并能够提取找到TP2的数据,然后提取等号后的值。我确信有一种更好的方法来编写代码,但我的解决方案如下。我将添加一个更改,以便能够接受任何文件名和更改的原因

MOP1Equal[strlen(MOP1Equal) -1] ='\0'; 
将csv文件放入excel和

MOP1Equal[strlen(MOP1Equal) -1] ='\0'; 
fprintf(file2, "\t%s", MOP1Equal+1); 
我加1是为了去掉=符号

MOP1Equal[strlen(MOP1Equal) -1] ='\0'; 
#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;
#包括
#包括
#包括
#定义最大线长度150
内部主(空){
文件*file1,*file2;
字符部分[最大行长度+1]=“更改前的起始值”;
字符TP2[4]=“TP2”;
字符DP3[4]=“DP3”;
char MOP1[4]=“OP1”;
char MOP2[4]=“OP2”;
字符等于[2]=“=”;
字符TP2Temp[最大行长度];
字符TP2Equal[最大行长度];
字符DP3Temp[最大行长度];
字符DP3Equal[最大行长度];
char MOP1Temp[最大行长度];
字符MOP1相等[最大行长度];
char MOP2Temp[最大线长度];
char MOP2Equal[最大线长度];
file1=fopen(“input.txt”,“r”);
file2=fopen(“output.txt”,“w”);
if(file1==NULL | | file2==NULL){
出口(1);
}
while(fgets(parts,sizeof(parts),file1)!=NULL){
int len=strlen(零件);
如果(部分[len-1]='\n'){
部分[len-1]='\0';
}
如果(strstr(零件,TP2)!=NULL){
strcpy(TP2Temp,strstr(零件,TP2));
strcpy(TP2Equal,strstr(TP2Temp,相等));
TP2Equal[strlen(TP2Equal)-2]='\0';
fprintf(文件2,“%s”,TP2Equal+2);
}
如果(strstr(零件,DP3)!=NULL){
strcpy(DP3Temp,strstr(零件,DP3));
strcpy(DP3Equal,strstr(DP3Temp,Equal));
DP3Equal[strlen(DP3Equal)-1]='\0';
fprintf(文件2,“\t%s”,DP3Equal+1);
}
如果(strstr(零件,MOP1)!=NULL){
strcpy(MOP1Temp,strstr(零件,MOP1));
strcpy(MOP1Equal,strstr(MOP1Temp,相等));
MOP1Equal[strlen(MOP1Equal)-1]='\0';
fprintf(文件2,“\t%s”,MOP1Equal+1);
}
如果(strstr(零件,MOP2)!=NULL){
strcpy(MOP2Temp,strstr(零件,MOP2));
strcpy(MOP2Equal,strstr(MOP2Temp,相等));
fprintf(文件2,“\t%s”,MOP2Equal+1);
}
}
fclose(文件1);
fclose(文件2);
返回0;

}
chardp3[3]=“DP3”-->
chardp3[4]=“DP3”
字符DP3[]=“DP3”
int len=strlen(部分)移动到if(parts[len-1]='\n'){
不计算两次
strstrstr
,更改
if(strstr(parts,MOP1)!=NULL){strcpy(MOP1Temp,strstr(parts,MOP1));
类似于
if((s=strstrstr(parts,MOP1))!=NULL){strcpy(MOP1Temp,s))
谢谢BLUEPIXY。我做了两项更改,现在它打印出了所有四项。我现在只需要让它打印带有字符的行的=符号后的值。这肯定让我找到了正确的方向。
MOP1Equal[strlen(MOP1Equal) -1] ='\0';