无限循环

时间:2013-11-26 06:00:04

标签: c infinite-loop

我正在阅读'C编程语言',我正在练习1-18:

 Write a program to remove trailing blanks and tabs from each line of input, and to delete entirely blank lines.

我写了一个程序如下,但事实证明这是一个无限循环。我使用gdb并发现第38行是无限进行的:if(arr[i] == '\t'),即使arr [i] =='\ t'不成立。怎么了?

01 #include <stdio.h>
02 #define MAXLINE 1000
03 
04 int delete(char arr[],int maxline);
05 int getlines(char arr[], int maxline);
06
07 int main(){
08     char arr[MAXLINE];
09     int len,i;
10     while((len = getlines(arr, MAXLINE)) > 0){
11         if(delete(arr, MAXLINE))
12             printf("%s",arr);
13     }
14     return 0;
15 }
16
17 /* Function getlines is used to input lines */
18 int getlines(char arr[], int maxline){
19    int i = 0,c;
20    while( i < maxline-1 && (c = getchar()) != EOF && c != '\n'){
21        arr[i] = c;
22        i++;
23    }
24    if( c == '\n'){
25        arr[i] = c;
26        i++;
27    }
28    arr[i] = '\0';
29    return i;
30 }
31
32 /* Function delete is used to delete tab and trailing blanks */
33 int delete(char arr[],int maxline){
34    int i = 0;
35    if(arr[i] == '\n') return 0;  /* if it's a blank line, return 0 */
36    int j;
37    while( arr[i] != '\0'){
38        if(arr[i] == '\t')
39            for( j = i; (arr[j] = arr[j+1]) != '\0'; j++)
40        i++;
41    }
42    for( j = i; j < maxline; j++)
43        arr[j] = arr[j+1];
44    return 1;
45 }

3 个答案:

答案 0 :(得分:1)

第39行的循环未终止。

for( j = i; (arr[j] = arr[j+1]) != '\0'; j++)

所以它调用

i ++ ;

作为它的身体。

至少使用:

for( j = i; (arr[j] = arr[j+1]) != '\0'; j++) { }

更好的是,围绕它放置{}:

{ for( j = i; (arr[j] = arr[j+1]) != '\0'; j++) { } }

答案 1 :(得分:0)

你永远不会到第40行,这会增加我。这就是为什么你永远不会退出从第37行开始的循环。

答案 2 :(得分:0)

在下面的代码arr[i] != '\0'中,导致无限循环。您没有正确递增i

while( arr[i] != '\0')
{
    if(arr[i] == '\t')
        for( j = i; (arr[j] = arr[j+1]) != '\0'; j++)
            i++;
}

使用以下代码删除标签

while( arr[i] != '\0')
{
    {
        if(arr[i] == '\t')
        for( j = i; (arr[j] = arr[j+1]) != '\0'; j++)
            i++;
    }
    i++; // Increment i here
}