嵌套开关导致无限循环

时间:2015-04-10 11:34:40

标签: c switch-statement infinite-loop

在下面的程序中,我需要将初始和最终字符更改为各自的字符,如下所述,但是这给了我一个无限循环。我该怎么做才能解决这个问题?

int main(void)
{
 char state ='t';
 char word[20]="aaabbccaaaaccbbb";

 int initiallength = strlen(word)-1; strcat(word,"a");
 while(strlen(word)-1 >initiallength)
 {
   switch(state)
   {
     case 't':
       switch(word[strlen(word)-1])
       {
         case 'a':
           word[strlen(word)-1]='b'; break;
         case 'b':
           word[strlen(word)-1]='c'; break;
         case 'c':
           word[strlen(word)-1]='d'; break;
         case 'd':
           word[strlen(word)-1]='\0'; break;
       }
       switch(word[0])
       {
         case 'a':
           word[0]='b'; break;
         case 'b':
           word[0]='c'; break;
         case 'c':
           word[0]='d'; break;
         case 'd': 
           word[0]='\0'; break;
       }
   }
 }
}

2 个答案:

答案 0 :(得分:0)

如果我理解你想要做的是交换给定字符串中的第一个和最后一个字符。如果是这种情况,首先你的代码太复杂了,其次是因为条件strlen(word)-1 >initiallength总是正确的。

答案 1 :(得分:0)

测试单词是否为空

int main(void){                                                                
    char state ='t';                                                           
    char word[20]="aaabbccaaaaccbbb";                                          

    int initiallength = strlen(word)-1;                                        

    strcat(word,"a");                                                          

    while(strlen(word)-1 >initiallength && strlen(word) >= 0){                 
        printf("%d %d\n", strlen(word)-1, initiallength);                      
        printf("%d len %s\n", strlen(word), word);                             
        switch(state){                                                         
          case 't':                                                            
            switch(word[strlen(word)-1]){                                      
              case 'a':                                                        
              case 'b':                                                        
              case 'c':                                                        
                word[strlen(word)-1]++;                                        
                break;                                                         
              case 'd':                                                        
                word[strlen(word)-1] = '\0';                                   
                break;                                                         
            }                                                                  

            switch(word[0]){                                                   
              case 'a':                                                        
              case 'b':                                                        
              case 'c':                                                        
                word[0]++;                                                     
                break;                                                         
              case 'd':                                                        
                word[0] = '\0';                                                
                break;                                                         
            }                                                                  
        }                                                                      
    }                                                                          
}