为什么我不能正确打印第一个/最后一个字符?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么我不能正确打印第一个/最后一个字符?相关的知识,希望对你有一定的参考价值。

我的输出字符串必须是输入字符串的palindrom。它几乎可以完美工作,但是我对输入字符串的第一个字符有疑问,我的新字符串不会打印出来(实质上,我的新字符串不会打印最后一个字符)。另外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;

}


答案

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

另一答案

对于启动器,功能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"

以上是关于为什么我不能正确打印第一个/最后一个字符?的主要内容,如果未能解决你的问题,请参考以下文章

printf 跳过字符数组的第一个字符[重复]

为啥下面的 C++ 代码只打印第一个字符?

为啥这两个矩阵不能正确连接

为啥我的代码不能在二叉搜索树中正确执行预排序?

在C中打印反转的字符串/数组

为啥此代码片段返回意外结果?