这是代码,它应该反转一个字符串。
#include <stdio.h>
void StrRev(char str[]) {
int len=strlen(str);
char out[len];
int i;
for(i=0;i<len;i++){
out[i]=str[len-i-1];
}
printf("%s",out);
}
int main(void) {
StrRev("TestString");
return 0;
}
预期产出:
gnirtStseT
实际输出:
gnirtStseT@
其他输入也会发生同样的事情,而其他输入则不然。
使用MingW编译Code :: Blocks
答案 0 :(得分:1)
两个问题:
您未能#include <string.h>
,因此strlen
没有声明。因此该函数隐式声明为int strlen()
。所以将它添加到文件的顶部。
您也没有将空终止字符添加到反向字符串中。
在for
循环之后,将数组中的一个附加字符设置为0.此外,您需要将数组放大一个以适应它。
#include <stdio.h>
// import declaration of strlen
#include <string.h>
void StrRev(char str[]) {
int len=strlen(str);
char out[len+1]; // increase length to make room for null terminator
int i;
for(i=0;i<len;i++){
out[i]=str[len-i-1];
}
out[i]=0; // add null terminator
printf("%s",out);
}
int main(void) {
StrRev("TestString");
return 0;
}
答案 1 :(得分:0)
strlen()
返回字符串的长度,末尾没有null终止符。因此,当您复制字符时,您最后会跳过NULL。如果您只是使用
int len=strlen(str) + 1;
而不是
int len=strlen(str);
然后一切都应该有效。