我写了一个反转字符串的代码。但在输出中它产生了一些垃圾。为什么?

I've written a code for reverse a string. But in output it is generating some garbage. Why?

这是我的代码。对于 o/p 中超过 3 个字母的单词,会生成垃圾值。

#include<stdio.h>
#include<stdlib.h>

int main(){
    char a[50],b[50];
    gets(a);
    puts(a);
    int len,i,j;
    i=0;
    while(a[i]!='[=10=]'){
       i++;
    }
    printf("Length: %d",i);
    //reverse
    len = i;
    j=len-1;
    for(i=0;i<=len-1;i++){
        printf("\ni=%d j=%d",i,j);
        b[i]=a[j];
        j--;

    }
    printf("\n___REVERSED TEXT___\n");
    puts(b);


}

对于初学者来说,程序中没有使用来自 header <stdlib.h> 的声明。所以这个指令

#include<stdlib.h>

可能会被删除。

根据 C 标准,不带参数的函数 main 应声明为

int main( void )

函数 gets 不安全,C 标准不再支持它。而是使用函数 fgets.

当存储在数组 a 中的字符串被复制到数组 b 时,终止零也应该被复制到结果字符串的末尾。

程序可以这样看

#include <stdio.h>

#define N   50

int main( void ) 
{
    char a[N], b[N];

    fgets( a, sizeof( a ), stdin );

    size_t length = 0;

    while ( a[length] != '[=12=]' && a[length] != '\n' ) ++length;

    a[length] = '[=12=]';

    puts( a );

    size_t i = 0;

    for ( ; i < length; i++ ) b[i] = a[length - i - 1];
    b[i] = '[=12=]';

    printf("\n___REVERSED TEXT___\n");
    puts( b );

    return 0;
}

它的输出可能看起来像

Hello, World!
Hello, World!

___REVERSED TEXT___
!dlroW ,olleH
#include<stdio.h>
#include<string.h>

int main(void){
    char a[50],b[50];

    printf("\nWhat is the word?");
    scanf("%s", a); fflush(stdin);
    int j;

    printf("Length: %lu",strlen(a));
    for(j = strlen(a) - 1; j >= 0; j--){
        b[strlen(a) - 1 - j] = a[j];
    }
    printf("\n___REVERSED TEXT___\n");
    printf("\n%s", b);
}
  • 使用string.h的strlen函数获取字符串的大小;
  • for从字符串a的末尾开始填充字符串b