C ++ ROT13函数崩溃

时间:2012-05-09 14:21:21

标签: function visual-c++ rot13

然而,我对C ++并不太满意;我的代码已编译,但函数崩溃了我的程序,下面是代码的简短总结;它不完整,但函数和调用就在那里。

void rot13(char *ret, const char *in);

int main()
{
    char* str;
    MessageBox(NULL, _T("Test 1; Does get here!"), _T("Test 1"), MB_OK);
    rot13(str, "uryyb jbeyq!"); // hello world!
    /* Do stuff with char* str; */
    MessageBox(NULL, _T("Test 2; Doesn't get here!"), _T("Test 2"), MB_OK);
    return 0;
}

void rot13(char *ret, const char *in){
    for( int i=0; i = sizeof(in); i++ ){
        if(in[i] >= 'a' && in[i] <= 'm'){
            // Crashes Here;
            ret[i] += 13;
        }
        else if(in[i] > 'n' && in[i] <= 'z'){
            // Possibly crashing Here too?
            ret[i] -= 13;
        }
        else if(in[i] > 'A' && in[i] <= 'M'){
            // Possibly crashing Here too?
            ret[i] += 13;
        }
        else if(in[i] > 'N' && in[i] <= 'Z'){
            // Possibly crashing Here too?
            ret[i] -= 13;
        }
    }
}

该功能进入“测试1;到达这里!” - 但它没有达到“测试2;不会到达这里!”

先谢谢你。 -Nick Daniels。

2 个答案:

答案 0 :(得分:2)

str未初始化,并且在rot13中被取消引用,导致崩溃。在传递给str之前(在堆栈上或动态地)为rot13()分配内存:

char str[1024] = ""; /* Large enough to hold string and initialised. */

for内的rot13()循环也不正确(infinte循环):

for( int i=0; i = sizeof(in); i++ ){

更改为:

for(size_t i = 0, len = strlen(in); i < len; i++ ){ 

答案 1 :(得分:0)

你有几个问题:

  • 您永远不会为输出分配内存 - 您永远不会初始化变量str。这就是导致你崩溃的原因。

  • 您的循环条件始终计算为true(=分配并返回指定的值,==测试是否相等)。

  • 你的循环条件使用sizeof(in)来获取输入字符串的大小,但这实际上会给你指针的大小。请改用strlen

  • 您的算法会将返回字符串中的值增加或减少13.输出字符串中的值与输出字符串中的初始值相比为+/- 13,而它们应基于输入字符串。

  • 您的算法无法处理“A”,“n”或“N”。

  • 您的算法不处理任何非字母字符,但您使用的测试字符串包含两个。