0

但是,我不太擅长 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;没有到达这里!”

提前谢谢你。-尼克丹尼尔斯。

4

2 回答 2

2

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

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

里面的for循环rot13()也不正确(无限循环):

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

改成:

for(size_t i = 0, len = strlen(in); i < len; i++ ){ 
于 2012-05-09T14:27:30.353 回答
0

你有几个问题:

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

  • 您的循环条件始终评估为真(= 分配并返回分配的值,== 测试相等性)。

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

  • 您的算法将返回字符串中的值增加或减少 13。您放置在输出字符串中的值与输出字符串中的初始值相差 +/- 13,此时它们应该基于输入字符串。

  • 您的算法不处理“A”、“n”或“N”。

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

于 2012-05-09T14:32:15.813 回答