PAWN语言中的反向字符串

时间:2018-07-21 05:24:50

标签: string reverse string-concatenation pawn

我尝试推翻单词,但出现一些我无法解释且不知道该怎么办的问题。

$_**=3

我的反向功能:

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的值消失了。我不知道该如何解释,也无法在PAWN指南中找到解释。 这里有结果截图。 first_reverse_test

我当然想推翻整个单词。像这样:

doubleWord

并删除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的值。 这里有结果截图。 second_reverse_test

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

doubleWord

但是我再次修改了printf ("doubleword = %s\n", doubleWord); ReverseWord(doubleWord, reversedWord); strdel(reversedWord,16,32); printf ("doubleword = %s, length = %d\n", doubleWord, strlen(doubleWord)); !这里有结果截图。 third_reverse_test

谁可以飞机发生什么情况? PAWN是否会记住堆或堆栈中变量的值并获取最后使用的变量?而我该如何扭转这种原因呢?

1 个答案:

答案 0 :(得分:1)

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

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

只需从参数中删除16,因为无论如何应该自动填充它。并非如此,请使用sizeof(doubleWord)