![](/img/trans.png)
[英]In C, why can't I assign a string to a char array after it's declared?
[英]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.