PAWN 语言中的反向字符串

Reverse string in PAWN language

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

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只是单词的cope,反转哪一部分并不重要。然后我连接它,然后 doubleWord 的值就消失了。我不知道如何解释这个,也没有在 PAWN 指南中找到解释。 这里的截图与结果。

当然,我试着颠倒整个单词。像这样:

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 值。 这里的截图与结果。

在第二个版本中,我也尝试 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 是否记住堆或堆栈中变量的值并获取最后使用的变量?我怎样才能扭转这个词的原因?

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

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

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