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