[英]An 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 }
您在第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++) { } }
您永遠不會到達第40行,該行會增加i。 這就是為什么您永遠不會退出從第37行開始的循環的原因。
在下面的代碼中, 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
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.