Printf有时会写出额外的字符

时间:2016-07-12 17:57:26

标签: c printf

这是代码,它应该反转一个字符串。

#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

2 个答案:

答案 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);

然后一切都应该有效。