2013-11-26 8 views
0

Я читаю «Язык программирования 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 } 

ответ

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++) { } } 
+0

Большое спасибо. Я скучаю по «;» в конце инструкции for. Теперь все в порядке: P – twoyoung

0

Вы никогда не получите в линию 40, которая будет приращение I. Вот почему вы никогда не выходите из цикла, который начинается со строки 37.

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 
} 
Смежные вопросы