2015-03-31 73 views
1

我写了一个rot13.c程序,但我可以告诉我的循环里面有些东西rot13_translate_string导致程序只是打印出空行。Rot13实现:error_string函数中的错误

有什么想法? 谢谢!

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

char rot13_translate_character(char c) 
{ 
    if('A' <= c && c <= 'M') 
    { 
      return c + 13; 
    } 
    else if('N' <= c && c <= 'Z') 
    { 
      return c - 13; 
    } 
    else if('a' <= c && c <= 'm') 
    { 
      return c + 13; 
    } 
    else if('n' <= c && c <= 'z') 
    { 
      return c - 13; 
    } 
    else 
    { 
      return c; 
    } 
} 

char *rot13_translate_string(const char *str) 
{ 
    int len   = strlen(str); 
    char *translation = calloc(len, sizeof(char)); 

    int i; 

    do //****HERE IN THIS SECTION 
    { 
      /* Translate each character, starting from the end of the string. */ 
      translation[len] = rot13_translate_character(str[len]); 
      len--; 
    } while(len < 0); //< 

    return translation; 
} 

这里是主要的(同一个文件的一部分) - 是我的条件为我= 1好吗?

int main(int argc, char **argv) 
{ 
    if(argc < 2) 
    { 

      fprintf(stderr, "Usage: %s word [word ...]\n", argv[0]); 
      return 1; 
    } 

    /* Translate each of the arguments */ 
    int i; 
    for(i = 1; i < argc; i++)  //*****IS this right? 
    { 
      char *translation = rot13_translate_string(argv[i]); 
      fprintf(stdout, "%s\n", translation); 
    } 

    return 0; 
} 
+2

'len--; } while(len <0);'当然应该是'while(len> = 0);'。 – 2015-03-31 05:39:44

+0

查看“rot13_translate_string”的定义会很有用。还要注意,你的代码似乎假定代表字母的字符的代码是连续的,但C不能保证。 – dhag 2015-03-31 06:12:19

回答

0

正如刚才它被詹尼斯指出的是环路控制做......而。它应该是
while(len >= 0);

“while”循环运行而控制表达式是真(并且终止一旦表达变为假)。您在循环之前定义变量len并且它不能是<0
所以你从来没有真正进入循环。

您获得,因为fprintf(stdout, "%s\n", translation);线各输入字,在那里你打印每个(空)字线(\n)一行。

在其它语言中,例如在帕斯卡,有“重复直到”环结构,它继续运行直到控制表达式为真,并且仅后,它改变它终止。
在这种情况下,您可以使用<0的条件。 在C遵循相同的逻辑,你可以使用而循环并取消条件。在你的情况下,
} while (! (len < 0));