【问题标题】:I've written a code for reverse a string. But in output it is generating some garbage. Why?我写了一个反转字符串的代码。但在输出中它会产生一些垃圾。为什么?
【发布时间】:2017-11-26 11:24:38
【问题描述】:

这是我的代码。对于 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]!='\0'){
       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);


}

【问题讨论】:

  • 永远不要使用gets();它不能安全使用。
  • 你是否终止了反向字符串?我认为不会。
  • 与您的问题无关,但您知道i&lt;=len-1i&lt;len 相同,对吧?意思相同,更易读,写更少。

标签: c string reverse


【解决方案1】:

对于初学者来说,程序中没有使用来自标题&lt;stdlib.h&gt; 的声明。所以这个指令

#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] != '\0' && a[length] != '\n' ) ++length;

    a[length] = '\0';

    puts( a );

    size_t i = 0;

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

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

    return 0;
}

它的输出可能看起来像

Hello, World!
Hello, World!

___REVERSED TEXT___
!dlroW ,olleH

【讨论】:

  • 为什么不(for i = 0, j = length; i &lt; j; i++, j--) 每次迭代交换 2 个?
  • @DavidC.Rankin 根据问题中提供的代码,他试图复制和反转字符串,而不是“原地”反转。
【解决方案2】:
#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

【讨论】:

    猜你喜欢
    • 2019-12-23
    • 1970-01-01
    • 1970-01-01
    • 2015-06-15
    • 2020-01-01
    • 1970-01-01
    • 2014-01-06
    • 2021-02-20
    • 1970-01-01
    相关资源
    最近更新 更多