I am trying to write a function that searches for the unique part(maximum two characters) of a string in an array of strings. Although strstr
and strchr
are not working and crash my program for some reason. So I have resorted to trying to create something that resembles their function.
我正在尝试编写一个函数来搜索字符串数组中字符串的唯一部分(最多两个字符)。虽然strstr和strchr没有工作,但由于某种原因导致程序崩溃。所以我试图创造类似于它们功能的东西。
My question is this:
Why is strstr not working (something like strstr(lex[j],word)
) and what am I doing wrong here?
我的问题是:为什么strstr不工作(类似于strstr(lex [j],word))以及我在这里做错了什么?
Here is the code for the function that searches for two unique characters within an array of strings :
下面是函数的代码,用于在字符串数组中搜索两个唯一字符:
void convert(char word[])
{
int i;
for (i = 0 ; i <= strlen(word) ; i++)
{
if(word[i] >= 65 && word[i] <= 90)
{
word[i] = word[i]+32;
}
}
}
int twochar(char lex[50][50],char word[], int size,char temp[3])
{
int i,j,k,count,totlen;
convert(word);
for (i = 0 ; i < strlen(word) - 1 ; i++)
{
count = 0;
totlen = 0;
for(j = 0; j<size; j++)
{
convert(lex[j]);
totlen += strlen(lex[j]) - 1;
for(k = 0 ; k < strlen(lex[j]) - 1 ; k++)
{
if (word[i] != lex[j][k] || word[i+1] != lex[j][k + 1])
{
count++;
}
}
}
if(count = = totlen)
{
temp[0] = word[i];
temp[1] = word[i+1];
}
}
}
int main(int argc, char *argv[])
{
char lex[50][50] = {"word1","word2","word3","word4" }, word[] = "test";
char p[3];
twochar(lex,word,4,p);
printf("%c%c\n",p[0],p[1]);
return 0;
}
1 个解决方案
#1
2
this line:
这一行:
for(k=0;k<strlen(lex[j])-1;k++)
is the problem.
是问题。
strlen(lex[0]) is 0
strlen(lex[0])-1 is -1 (0xFFFFFFFF in a 32 bit system)
k starts at 0 and is incremented until it is equal to 0xFFFFFFFF
of course, k exceeds the bounds of lex[0] when k = 50.
当然,当k = 50时,k超过lex [0]的界限。
the result is undefined behaviour which leads to the seg fault event
结果是未定义的行为导致seg故障事件
To determine all the above, I compiled/linked the program via gcc, with the -ggdb parameter.
为了确定以上所有内容,我使用-ggdb参数通过gcc编译/链接了程序。
then I ran the program via 'gdb theprogram'
然后我通过'gdb theprogram'运行程序
within gdb I entered
br main <-- break point set
run
c <-- continue
the program then crashed with a seg fault event
then I entered
bt <-- back trace
the bt showed me this line: 'if(word[i]!=lex[j][k] || word[i+1]!=lex[j] [k+1])'
Then I entered
p k <-- print variable k
=6832 (which is WAY out of bounds)
then I entered
run
y
br theprogram.c:41 (the line number from above) <-- set another break epoint
c
the program stopped at line 41
p j
=0 ( this was the gdb response )
p k
= 0
p i
= 0
a little thinking,
stepping though that inner loop using 'n' <-- next
and playing on gdb
indicated that the problem was in line 42
and resulted in revealing the root of the problem
#1
2
this line:
这一行:
for(k=0;k<strlen(lex[j])-1;k++)
is the problem.
是问题。
strlen(lex[0]) is 0
strlen(lex[0])-1 is -1 (0xFFFFFFFF in a 32 bit system)
k starts at 0 and is incremented until it is equal to 0xFFFFFFFF
of course, k exceeds the bounds of lex[0] when k = 50.
当然,当k = 50时,k超过lex [0]的界限。
the result is undefined behaviour which leads to the seg fault event
结果是未定义的行为导致seg故障事件
To determine all the above, I compiled/linked the program via gcc, with the -ggdb parameter.
为了确定以上所有内容,我使用-ggdb参数通过gcc编译/链接了程序。
then I ran the program via 'gdb theprogram'
然后我通过'gdb theprogram'运行程序
within gdb I entered
br main <-- break point set
run
c <-- continue
the program then crashed with a seg fault event
then I entered
bt <-- back trace
the bt showed me this line: 'if(word[i]!=lex[j][k] || word[i+1]!=lex[j] [k+1])'
Then I entered
p k <-- print variable k
=6832 (which is WAY out of bounds)
then I entered
run
y
br theprogram.c:41 (the line number from above) <-- set another break epoint
c
the program stopped at line 41
p j
=0 ( this was the gdb response )
p k
= 0
p i
= 0
a little thinking,
stepping though that inner loop using 'n' <-- next
and playing on gdb
indicated that the problem was in line 42
and resulted in revealing the root of the problem