gpt4 book ai didi

c - 使用 strstr 查找四个不同的部分单词

转载 作者:行者123 更新时间:2023-11-30 16:51:20 24 4
gpt4 key购买 nike

我正在查找包含 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,对吧?您的书会向您解释许多其他内容,因此我们不需要这样做,strstr 要求其操作数是字符串,并且字符串始终 包含终止'\0'。你的终止'\0'在哪里? strstr 如何知道 DP3 指向的字符串的长度?

由于您的 token 的长度最多为三个字节,因此您目前一次只需要读取和存储最多三个字节即可进行搜索(四个字节包括上面解释的终端字节;下面未经测试且不完整的示例);此要求可能会改变,如果您决定引入更长(或动态调整大小)的标记,您的光标将需要与最长的标记一样宽。

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

关于c - 使用 strstr 查找四个不同的部分单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41820523/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com