我正在阅读'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 }
答案 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
}