Почему я не могу напечатать первый / последний символ правильно? - PullRequest
0 голосов
/ 24 марта 2020

Моя выходная строка должна быть палиндромом входной строки. Это работает почти идеально, но у меня проблема с первым символом входной строки, моя новая строка не будет печатать его (по сути, моя новая строка не будет печатать последний символ). Также 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;

}


Ответы [ 2 ]

3 голосов
/ 24 марта 2020

Для начинающих функция gets является небезопасной функцией и не поддерживается стандартом C.

Вам следует использовать стандартную C функцию fgets.

Там две проблемы с вашим кодом. Первый в этом l oop

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 голосов
/ 24 марта 2020

i никогда не равен нулю. Вот почему первый символ (input_str[0]) игнорируется.

...