C无限循环麻烦

时间:2017-02-08 04:13:08

标签: c

我正在研究C中的程序,该程序应该在字符串badword中为类找到单词str的实例。这是我明天考试的练习考试,因此不适合成绩或任何其他考试。无论如何,我认为我的代码陷入无限循环但我无法弄清楚是什么导致它。我使用printf来调试我的代码,但它并没有真正帮助,因为我仍然无法隔离问题。我想在这一点上我已经看了太久了,我需要另外一双眼睛来帮助我。基本上,我只是让它在循环中运行了一段时间,然后最终,我得到一个分段错误,程序停止。这是我的代码:

35 int mystrlen(char * s)
36 { 
37   int i=0;
38   while(s[i] != 0)
39   { 
40     i++;
41   }
42   return i;
43 }
44 
45 char *mystrstr(char *hay, char *needle)
46 { 
47   int i=0; 
48   for(i=0; i<mystrlen(hay); i++)
49   { 
50     if(hay[i] == needle[0])
51     { 
52       int j=0;
53       int isSubString = 1;
54       for(j=0; j<mystrlen(needle); j++)
55       {
56         if(hay[i+j] != needle[j])
57         { 
58           isSubString = 0;
59         }
60       }
61 
62       if(isSubString == 1)
63       { 
64         return &hay[i];
65       }
66     }
67   }
68   return hay;
69 }
70 
71 int isSpaceChar(char input)
72 {
73   if(input == ' ' || input == '\n' || input == '\r' || input == '\t' || input == '\0')
74   {
75     return 1;
76   }
77   else
78   {
79     return 0;
80   }
81 }
82 
83 #include<stdio.h>
84
85 void censorWord(char * str, char * badword)
86 {
87   printf("Censoring Word\n");
88   char *badwordPointer = str;
89   while((badwordPointer = mystrstr(badwordPointer, badword)) != str)
90   {
91     printf("In the NULL check loop!\n");
92     printf("%d\n", *badwordPointer);
93     if(&str < &badwordPointer && isSpaceChar(badwordPointer[-1]) && isSpaceChar(badwordPointer[mystrlen(badword)]))
94     {
95       int len = mystrlen(badword);
96       int i;
97       for(i=0; i<len; i++)
98       {
99         badwordPointer[i] = 'X';
100       }
101     }
102     badwordPointer = &badwordPointer[1];
103   }
104 }

(抱歉有关行号,但是.. vim ..删除它们需要很长时间)

这是一个示例输出:

 1 censorWord Main is being run!
 2 Censoring Word
 3 In the NULL check loop!
 4 116
 5 In the NULL check loop!
 6 116
 7 In the NULL check loop!
 8 104
 9 In the NULL check loop!
10 101
11 In the NULL check loop!
12 97
13 In the NULL check loop!
14 116
15 In the NULL check loop!
16 114
17 In the NULL check loop!
18 101
19 In the NULL check loop!
20 0
21 In the NULL check loop!
22 0
23 In the NULL check loop!
24 88
25 In the NULL check loop!
26 88
27 In the NULL check loop!
28 0
29 In the NULL check loop!
30 0
....
270172 88
270173 In the NULL check loop!
270174 88
270175 In the NULL check loop!
270176 0
270177 In the NULL check loop!
270178 0
270179 In the NULL chec
Segmentation Fault.

当然,输出没有那些行号,因为它在终端,但我不得不从txt文件中复制它,这就是为什么它们在那里。

如果有人可以帮助我,我会非常感激。

1 个答案:

答案 0 :(得分:1)

主要问题是,如果您的mystrstr函数找不到needle,则会返回它的第一个参数,但在censorWord函数中,您将此值与str进行比较,这是你的初始字符串。因此,在某些时候,您将无限地将空字符串与您的初始字符串进行比较 如果找不到针,则从hay返回mystrstr对我没有意义。我建议您在mystrstrcensorWord中进行一些小的更改:

char *mystrstr(char *hay, char *needle)
{
  int i = 0;
  for (i = 0; i < mystrlen(hay); i++)
  {
    if (hay[i] == needle[0])
    {
      ....
      if (isSubString == 1)
      {
        return &hay[i];
      }
    }
  }
  return NULL; // <==
}

void censorWord(char * str, char * badword)
{
  ....
  while ((badwordPointer = mystrstr(badwordPointer, badword)) != NULL) // <==
  ....
}