0

该代码不起作用,它没有给出准确的结果。我不知道问题出在哪里或错过了编码?我的输入和输出:

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

3 回答 3

0
    #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 函数交换代码中,没有以正确的方式完成。对于输入一行,您可以使用scanf("%[^\n]s", str);.

您的代码中的另一个错误是您没有颠倒最后一句话。所以在你的 revwords 函数中的 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);
}

使用此代码块进行更改,并希望它能解决。它只是您的代码的修改版本。

于 2020-04-28T10:49:58.993 回答
0

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

那么你的指数计算不正确。你似乎试图从 to 反转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

于 2020-04-28T10:33:46.210 回答
0

rev和两个函数revwords都不正确。

例如,通常用户可以传递一个空字符串。在这种情况下,revwords由于 for 循环中的初始条件,函数会调用未定义的行为

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

此外,如果传递的字符串不包含空格,即它仅包含一个单词,则不会反转任何内容。

在函数rev中循环的条件不正确

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

例如 if formis equal to 3and tois equal to 5then 表达式i <= to/2产生2并且循环将永远不会被执行。

除此之外,交换字符的代码

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

也是不正确的。

并且至少该函数revwords应该具有char *遵循标准 C 字符串函数约定的返回类型。

考虑到该函数fgets可以将换行符附加到输入的字符串中。你应该删除它。

这是一个演示程序,展示了如何实现这些功能。我只重命名了函数名。

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

程序输出可能看起来像

Enter a sentence: hello im here to help you
hello im here to help you
olleh mi ereh ot pleh uoy
于 2020-04-28T11:15:18.990 回答