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

Я пытаюсь получить свой код, кроме ввода, а затем развернуть и распечатать его без лишних строк. Я взял все \ n, чтобы посмотреть, поможет ли это, но я всегда получаю новую строку перед печатью. Я предполагаю, что он печатает нулевой символ в конце ввода пользователя, но я не знаю, как от него избавиться.

Это то, что я имею до сих пор

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

void revStr(char str[]);

int main(void) 
{ 
    char str[50]; 
    fgets(str, 50, stdin);

    if ((strcmp(str, "quit\n") == 0) || (strcmp(str, "q\n")==0) || (strcmp(str, "Quit\n")== 0)){
        printf("\n");
        return 0;
    }
    else{
        revStr(str);
        return main();
    }  
} 
void revStr(char str[])
{
    int arrSz = strlen(str); 

    int i; 
    for(i = arrSz-1; i >= 0; i--){
        if(str[i] != '\0')
        printf("%c",str[i]);

    } 
}

Ответы [ 2 ]

0 голосов
/ 06 апреля 2020

Это не имеет ничего общего с нулевым символом в конце строки. При использовании программы из терминала, она, кажется, содержит две новые строки, такие как:

abc

cba

Первая новая строка появляется, потому что консоль печатает все, что вы вводите «abc [enter]».

Вторая новая строка происходит потому, что fgets() возвращает строку, включающую новую строку, например, "abc \ n". Ваша функция revStr() затем печатает строку в обратном порядке с первой новой строки.

0 голосов
/ 06 апреля 2020

Посмотрите на это, если оператор

if ((strcmp(str, "quit\n") == 0) || (strcmp(str, "q\n")==0) || (strcmp(str, "Quit\n")== 0)){

Вы видите, что каждый строковый литерал, используемый в условии, имеет дополнительно символ новой строки '\n'.

Это означает, что массив символов str имеет этот символ, и этот символ выводится в функции, которая выводит массив в обратном порядке.

Вы можете удалить символ из массива перед передачей его функции следующим образом

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

Или это необходимо сделать до того, как оператор if и оператор if переписать, как

if ((strcmp(str, "quit") == 0) || (strcmp(str, "q")==0) || (strcmp(str, "Quit")== 0)){

Обратите внимание, что рекурсивный вызов main не имеет большого смысла.

return main();

Вы можете заключить код в main в al oop.

Сама функция должна быть объявлена ​​и определена как минимум следующим образом

void revStr( const char str[] )
{
    size_t arrSz = strlen( str ); 

    while ( arrSz-- ) putchar( str[arrSz] );
}

Вот демонстрационная программа

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

void revStr( const char str[] )
{
    size_t arrSz = strlen( str ); 

    while ( arrSz-- ) putchar( str[arrSz] );
}

int main(void) 
{
    revStr( "Hello World!" );

    return 0;
}

Его вывод

!dlroW olleH
...