繁体   English   中英

为什么数组在C中字符串后有路径?

[英]Why array has the path after string in C?

编辑我重新排列了代码并修复了循环错误。现在数组可以正常工作,但是仍然存在一个问题。循环迭代并找到字符串中的模式,然后对其进行标记。之后,它会不断迭代并在字符串中找到另一个相同的模式文本。然后对其进行标记,但是在执行此操作时,它将重置第一个标记的模式。 这样控制台输出就像

输出值

found at 3 to 6
hi
<mark>how</mark> are you
fine
how are you to
found at 20 to 23
hi
how are you
fine
<mark>how</mark> are you to

/ 如何存储第一个数组?我无法处理const char数组样式 /

/ *我想要这样的输出:

found at 3 to 6
hi
<mark>how</mark> are you
fine
how are you to
found at 20 to 23
hi
<mark>how</mark> are you
fine
<mark>how</mark> are you to

如果您有帮助,我非常感谢


我想用蛮力算法进行字符串匹配。 我认为我正确地编写了算法,并且效果很好。 但是我有一个问题。 即使该模式多次出现在字符串中,该算法也只能找到一个模式。 它只会找到第一个。 因此,我尝试在for循环中一遍又一遍地调用它。 但是我有一个问题。 当我尝试一遍又一遍调用时,它弄乱了我的数组。 在运行时,即使数组中没有路径,我也会看到一些路径吗? 可能是什么原因呢?

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX 200
  char *textCOOL;

  /* try to find the given pattern in the search string */
  int bruteForce(char *text, char *pattern,int stringlength,int patternlength) {
        char *text2;
        text2 = (char *) malloc(MAX);
        textCOOL = (char *) malloc(MAX);
        int i, j;
        int p=1;
        for (i = 0; i <= stringlength - patternlength; i++) {
            j=0;
            while (j < patternlength && pattern[j]==text[i+j]){

            j=j+1;

            if(j==patternlength ){
                int lentino;
                lentino=patternlength+(i);
                printf("from %d to %d i found\n",i,lentino);
                p=0;
                int start1;
                int start2;
                int start3;

                for(start1=0;start1<i;start1++){
                    text2[start1]=text[start1];
                }

                text2[i]='<';
                text2[i+1]='m';
                text2[i+2]='a';
                text2[i+3]='r';
                text2[i+4]='k';
                text2[i+5]='>';

                for(start2=0;start2<patternlength;start2++){
                    text2[(i+6+start2)]=pattern[start2];
                }
                text2[(i+6+patternlength)]='<';
                text2[(i+7+patternlength)]='/';
                text2[(i+8+patternlength)]='m';
                text2[(i+9+patternlength)]='a';
                text2[(i+10+patternlength)]='r';
                text2[(i+11+patternlength)]='k';
                text2[(i+12+patternlength)]='>';

                for(start3=0;start3<stringlength-1;start3++){

                    if(text[i+patternlength+start3]=='\0'){

                    text2[((i+13+patternlength)+start3)]='\0';
                    break;
                }
                    else{       
                    text2[((i+13+patternlength)+start3)]=text[i+patternlength+start3];
                }
            }       
                printf("%s",text2);

            }

            }
  }
   if(p==1){
                printf(" Not  found\n");    
            }
}

  int main() {
        char searchStr[MAX], pattern[MAX];
        int res;
        char j;
        FILE *fp;
        int start;
        int end;
        start=0;
        end=MAX;

        fp = fopen("deneme.txt", "r");

       if (fp == NULL) {
         printf("I couldn't open deneme.txt for writing.\n");
         exit(0);
      }
      int i;
        for(i=0; i<MAX; i++){
        j='\0';
        fscanf(fp,"%c",&j); 
        searchStr[i]=j;
}

      printf("%s\n",searchStr);

          fclose(fp);
        printf("Enter Pattern String:");
        fgets(pattern, MAX, stdin);
        searchStr[strlen(searchStr)-1] = '\0';
        pattern[strlen(pattern)-1] = '\0';
        res = bruteForce(searchStr, pattern, strlen(searchStr), strlen(pattern));

        return 0;

}

1)您为每次匹配添加13个字节,但您没有跟踪自己停留在字符串范围之内。

2)bruteForce for(start3 = ...循环不会nul终止text2。当您按下nul时,您将停止复制。

3)例如,当您填写textCOOL时,您会遇到很多一次性错误。

C中用于迭代字符串的惯用法是:

for (i = 0; i < stringlength; i++)

除非您真的要遍历nul

4)bruteForce应该返回一个int,但不返回任何东西。 您可能打算返回p

5)您应该删除未使用的变量。 这将有助于阐明您的代码。

6)完成使用后,应释放()RAM给malloc()

7)最好将text和pattern参数标记为const并返回指向您的malloc()字符串的指针(无匹配时为NULL)

8)在main()中,将char2分配给malloc()。 j不是指针,不应将其分配给malloc。 该变量将不再使用。 只需删除它。

9)对自己的未来自我好。 查找比文字$ NUMBER更多的描述性名称

您可能会在bruteForce中覆盖text2的nul-terminator,然后将strcpy()转换为文本时,您将获取RAM中存在的所有垃圾数据,直到您幸运地达到0值为止。 您似乎在那里有文件路径。

编辑:

每次您有一个匹配项时,都将文本的开头复制到text2中,直到模式匹配为止。

for (start1 = 0; start1 < i; start1++) {
    text2[start1]=text[start1];
}

相反,您需要另一个变量来跟踪目标字符串中的位置。

int dest = 0;

for (i = 0; i <= stringlength - patternlength; i++) {
    ...
            for(start1 = i-patternlength; start1 < i; start1++){
                text2[dest]=text[start1];
            }
            dest += sprintf(&text2[dest], "<mark>%s</mark>", pattern);
            printf("%s",text2);
    ...
}

干杯

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM