簡體   English   中英

使用用戶定義的函數反轉 C 中給定字符串的單詞

[英]Reverse of words of a given string in C using user defined functions

該代碼不起作用,它沒有給出准確的結果。 我不知道問題出在哪里或錯過了編碼? 我的輸入和 output:

Enter a sentence :
hello im here to help you
heleh im here to help you

我使用了以下代碼,

int main()
{
    /*
    Enter a sentence to get reverse of each word
    hello this is CPROGRAM Enjoy Programming
    olleh siht si MARGORPC yojnE gnimmargorP
    */
    char str[100];
    printf("Enter a sentence : \n");
    fgets(str, 100, stdin);
    revwords(str);
    fputs(str, stdout);
    return 0;
}
void revwords(char* str){
    int i = 0;
    for(int j=1;str[j] != '\0';j++){
        if( str[j] == ' ' || str[j] == '\t' || str[j] == '\n'){
            rev(str, i, j-1);
            i = j+1;
            j++;
        }
    }
}
void rev(char* str, int from, int to){
    char temp;
    for(int i=from;i<= to/2;i++){
        temp = str[i];
        str[to-i] = str[i];
        str[to-i] = temp;
    }
}

您的版本rev以多種方式損壞:

void rev(char* str, int from, int to){
    char temp;
    for(int i=from;i<= to/2;i++){
        temp = str[i];
        str[to-i] = str[i];
        str[to-i] = temp;
    }
}

第一:你的交換壞了。 您分配給str[to-i]兩次,從不分配給另一個方向。

void rev(char* str, int from, int to){
    char temp;
    for(int i=from;i<= to/2;i++){
        temp = str[i];
        str[i] = str[to-i];
        str[to-i] = temp;
    }
}

那么你的指數計算不正確。 您似乎試圖從fromto反轉,但您將to視為一個長度。 您需要使用單獨的索引:

void rev(char* str, int from, int to){
    char temp;
    for(int i=0; i <= (to-from)/2; i++){
        temp = str[from+i];
        str[from+i] = str[to-i];
        str[to-i] = temp;
    }
}

否則,如果您從 10..15 反轉,您將復制到索引 5..0 而不是 15..10

    #include<stdio.h>

    int main()
   {
    /*
    Enter a sentence to get reverse of each word
    hello this is CPROGRAM Enjoy Programming
    olleh siht si MARGORPC yojnE gnimmargorP
    */
    char str[100];
    printf("Enter a sentence : \n");

    //fgets(str, 100, stdin);
    scanf("%[^\n]s", str);

    revwords(str);

    //fputs(str, stdout);
    printf("%s\n",str);

    return 0;
}
void revwords(char* str){
    int i = 0;
    for(int j=1;str[j] != '\0';j++){
        if( str[j] == ' ' || str[j] == '\t' || str[j] == '\n'){
            rev(str, i, j-1);
            i = j+1;
            j++;
        }
    }
}
void rev(char* str, int from, int to){
    char temp;
    while(from <= to){
        temp = str[from];
        str[from] = str[to];
        str[to] = temp;
        from++;
        to--;
    }
}

你可以試試這段代碼。 在您的 rev function 代碼中,交換沒有以正確的方式完成。 對於輸入一行,您可以使用scanf("%[^\n]s", str); .

您的代碼中的另一個錯誤是您沒有顛倒最后一句話。 所以在你的revwords function 中的for循環之外需要反轉最后一個單詞。 這不是修復此代碼,請自行嘗試,如果找不到,請發表評論。

void revwords(char* str){
    int i = 0;
    int j;
    for(j=1;str[j] != '\0';j++){
        if( str[j] == ' ' || str[j] == '\t' || str[j] == '\n'){
            rev(str, i, j-1);
            i = j+1;
            j++;
        }
    }
    rev(str,i,j-1);
}

使用此代碼塊進行更改,並希望它能解決。 它只是您的代碼的修改版本。

revrevwords這兩個函數都不正確。

例如,通常用戶可以傳遞一個空字符串。 在這種情況下,由於 for 循環中的初始條件,function revwords調用未定義的行為

for(int j=1;str[j] != '\0';j++){

此外,如果傳遞的字符串不包含空格,即它僅包含一個單詞,則不會反轉任何內容。

在 function rev中循環的條件不正確

for(int i=from;i<= to/2;i++){

例如,如果form等於3並且to等於5 ,則表達式i <= to/2產生2並且永遠不會執行循環。

除此之外,交換字符的代碼

    temp = str[i];
    str[to-i] = str[i];
    str[to-i] = temp;

也是不正確的。

並且至少 function revwords應該具有返回類型char *遵循標准 C 字符串函數的約定。

考慮到 function fgets可以 append 將換行符轉換為輸入的字符串。 你應該刪除它。

這是一個演示程序,展示了如何實現這些功能。 我只重命名了 function 名稱。

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

static char * reverse( char *s, size_t n ) 
{ 
    for ( size_t i = 0; i < n / 2; i++ ) 
    { 
        char c = s[ i ]; 
        s[ i ] = s[ n - i - 1 ]; 
        s[ n - i - 1 ] = c; 
    } 

    return s; 
} 

char * reverse_by_words( char *s ) 
{ 
    const char *delim = " \t\n"; 

    char *p = s; 

    while ( *p ) 
    { 
        p += strspn( p, delim ); 

        if ( *p ) 
        { 
            char *q = p; 

            p += strcspn( p, delim ); 

            reverse( q, p - q ); 
        } 
    } 

    return s; 
} 

int main(void)  
{
    enum { N = 100 };
    char s[N];

    printf( "Enter a sentence: " );

    fgets( s, N, stdin );   

    //  remove the appended new line character '\n'
    s[ strcspn( s, "\n" ) ] = '\0';

    puts( s ); 

    puts( reverse_by_words( s ) ); 

    return 0; 
}

程序 output 可能看起來像

Enter a sentence: hello im here to help you
hello im here to help you
olleh mi ereh ot pleh uoy

暫無
暫無

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

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