1

我尝试反转单词,但遇到一些我无法解释且不知道该怎么做的问题。

new word{8};
GetWord(coords, word);
printf ("%s\n", word);
new doubleWord {16};
new reversedWord {16};
strcat (doubleWord, word, 16);
printf ("doubleword = %s\n", doubleWord);
strcat (doubleWord, word, 16);
printf ("doubleword = %s\n", doubleWord);
ReverseWord(doubleWord, reversedWord);
strcat (reversedWord, reversedWord, 16);
printf ("doubleword = %s, length = %d\n", doubleWord, strlen(doubleWord));
printf ("doubleword = %s, reverseword = %s\n", doubleWord, reversedWord);

我的反向功能:

ReverseWord(word{}, rev{}) {
    for (new i = 0; i < 8; i++){
        rev{i} = word{8-i};
    }
}

在函数中,我只反转一个部分,因为doubleWord它只是处理单词并且反转哪个部分并不重要。然后我将它连接起来,然后这个值doubleWord就消失了。我不知道如何解释这一点,也没有在 PAWN 指南中找到解释。这里有结果的截图。 first_reverse_test

我当然会尝试颠倒整个单词。像这样:

ReverseWord(word{}, rev{}) {
    for (new i = 0; i < 16; i++){
        rev{i} = word{15-i};
    }
}

并删除strcat

printf ("doubleword = %s\n", doubleWord);
ReverseWord(doubleWord, reversedWord);
printf ("doubleword = %s, length = %d\n", doubleWord, strlen(doubleWord));

但后来我最终reversedWord得到doubleWord了价值。这里有结果的截图。 second_reverse_test

在第二个版本中,我还尝试从末尾strdel删除值:doubleWord

printf ("doubleword = %s\n", doubleWord);
ReverseWord(doubleWord, reversedWord);
strdel(reversedWord,16,32);
printf ("doubleword = %s, length = %d\n", doubleWord, strlen(doubleWord));

但我又被doubleWord修改了!这里有结果的截图。 第三个反向测试

谁能解释发生了什么?PAWN 是否记住堆或堆栈中变量的值并获取最后使用的变量?我怎样才能扭转这个词的原因?

4

1 回答 1

1

您的代码有两个问题。首先,为初始字符串保留 8 个字符,但缺少空终止字符。如果您希望字符串包含 8 或 16 个字符,则大小应为 9 和 17。

第二个问题是您将数组的长度(以字符为单位)传递给strcat,但该函数需要以单元格为单位的大小。结合字符串不适合其目标数组的事实,该函数将空字节写入错误的位置。这是堆栈上的下一个数组,导致两者都doubleWordword“擦除”(第一个单元格设置为 0)。

只需16从参数中删除,因为无论如何它都应该自动填充。它没有,使用sizeof(doubleWord).

于 2018-07-26T00:37:29.407 回答