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
,但该函数需要以单元格为单位的大小。结合字符串不适合其目标数组的事实,该函数将空字节写入错误的位置。这是堆栈上的下一个数组,导致 doubleWord
和 word
都为 "erased"(第一个单元格设置为 0)。
只需从参数中删除 16
,因为它应该会自动填充。如果没有,请使用 sizeof(doubleWord)
.
我尝试反转单词,但遇到了一些我无法解释也不知道该怎么办的问题。
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
,但该函数需要以单元格为单位的大小。结合字符串不适合其目标数组的事实,该函数将空字节写入错误的位置。这是堆栈上的下一个数组,导致 doubleWord
和 word
都为 "erased"(第一个单元格设置为 0)。
只需从参数中删除 16
,因为它应该会自动填充。如果没有,请使用 sizeof(doubleWord)
.