【问题标题】:Why I can't print first/last character right?为什么我不能打印第一个/最后一个字符?
【发布时间】:2020-07-05 06:31:25
【问题描述】:

我的输出字符串需要是输入字符串的回文。它工作得几乎完美,但我对输入字符串的第一个字符有问题,我的新字符串不会打印它(本质上我的新字符串不会打印最后一个字符)。 strrev() 在 Ubuntu 上也不起作用,所以我需要在不使用该函数的情况下执行此操作。

#include <stdio.h>
#include <string.h>
int main(void){

    int i,j=0;

    char input_str[10];
    char new_str[10];

    printf("Enter characters:\n");

    gets(input_str);

    for(i=strlen(input_str)-1;i>0;i--){

        new_str[j]=input_str[i];
        j++;

    }

    printf("Output:\n");
    printf("%s", new_str);

    return 0;

}


【问题讨论】:

  • 在循环后添加new_str[j] = 0; 以正确终止字符串。
  • gets() 是一个已弃用的函数;请改用fgets()

标签: c function char reverse c-strings


【解决方案1】:

对于初学者来说,函数 gets 是不安全的函数,不受 C 标准支持。

您应该使用标准 C 函数 fgets

您的代码有两个问题。第一个在这个循环中

for(i=strlen(input_str)-1;i>0;i--){

    new_str[j]=input_str[i];
    j++;

}

索引 i 等于 0 被跳过使用它来复制源字符串的相应字符。

第二个是目标数组没有附加终止零字符。

这是一个演示程序,它展示了如何实现对源字符串进行反向复制的函数。

#include <stdio.h>
#include <string.h>

char * reverse_copy( char *dsn, const char *src )
{
    size_t n = strlen( src );

    size_t i = 0;

    for ( ; i < n; i++ )
    {
        dsn[i] = src[n - i - 1];
    }

    dsn[i] = '\0';

    return dsn;
}

int main(void) 
{
    enum { N = 10 };
    char input_str[N] = "";
    char new_str[N];

    printf( "Enter a string (less than %zu symbols): ", ( size_t )N );

    fgets( input_str, N, stdin );

    input_str[ strcspn( input_str, "\n" ) ] = '\0';

    printf( "\"%s\"\n", input_str );
    printf( "\"%s\"\n", reverse_copy( new_str, input_str ) );

    return 0;
}

程序输出可能如下所示

Enter a string (less than 10 symbols): Hello
"Hello"
"olleH"

【讨论】:

    【解决方案2】:

    i 永远不会是零。这就是忽略第一个字符 (input_str[0]) 的原因。

    【讨论】:

      猜你喜欢
      • 2013-09-28
      • 2016-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多