我尝试推翻单词,但出现一些我无法解释且不知道该怎么办的问题。
$_**=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指南中找到解释。
这里有结果截图。
我当然想推翻整个单词。像这样:
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
的值。
这里有结果截图。
在第二个版本中,我也尝试使用doubleWord
从末尾删除strdel
值:
doubleWord
但是我再次修改了printf ("doubleword = %s\n", doubleWord);
ReverseWord(doubleWord, reversedWord);
strdel(reversedWord,16,32);
printf ("doubleword = %s, length = %d\n", doubleWord, strlen(doubleWord));
!这里有结果截图。
谁可以飞机发生什么情况? PAWN是否会记住堆或堆栈中变量的值并获取最后使用的变量?而我该如何扭转这种原因呢?
答案 0 :(得分:1)
您的代码有两个问题。首先,您为初始字符串保留8个字符,但缺少空终止符。如果希望字符串包含8个或16个字符,则大小应为9和17。
第二个问题是您将以字符为单位的数组长度传递给strcat
,但是该函数期望以单元格为单位的大小。结合字符串不适合其目标数组的事实,该函数将空字节写入错误的位置。这是堆栈中的下一个数组,导致doubleWord
和word
都被“擦除”(第一个单元格设置为0)。
只需从参数中删除16
,因为无论如何应该自动填充它。并非如此,请使用sizeof(doubleWord)
。