簡體   English   中英

為什么我的反轉字符數組會打印額外的一行?

[英]Why does my reversed char array print an extra line?

我試圖讓我的代碼除了輸入之外,然后在沒有任何額外行的情況下反轉並打印它。 我已經把所有的 \n 都拿出來看看是否有幫助,但我總是在打印之前換行。 我猜它在用戶輸入的末尾打印 null 字符,但我不知道如何擺脫它。

這是我到目前為止所擁有的

#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]);

    } 
}

看看這個 if 語句

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

您會看到條件中使用的每個字符串文字都有新的換行符'\n'

表示字符數組str有這個字符,這個字符在輸出數組的function中以相反的順序輸出。

您可以通過以下方式將字符從數組中刪除,然后再將其傳遞給 function

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

或者甚至在 if 語句和 if 語句重寫之前這樣做

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

注意 main 的遞歸調用沒有多大意義。

return main();

您可以將 main 中的代碼包含在一個循環中。

function 本身應至少按以下方式聲明和定義

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;
}

它的 output 是

!dlroW olleH

它與字符串末尾的 null 字符沒有任何關系。 從終端使用程序時,它似乎包含兩個換行符,例如:

abc

cba

出現第一個換行符是因為控制台正在打印您鍵入“abc[enter]”的所有內容。

出現第二個換行符是因為fgets()返回包含換行符的字符串,例如“abc\n”。 您的revStr() function 然后以相反的順序打印字符串,首先是換行符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM