Closed. This question is off-topic。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗? Update the question,因此它是on-topic,用于堆栈溢出。
                        
                        2年前关闭。
                                                                                            
                
        
我编写了代码来反转用户输入的句子,但是当我运行此代码并编写句子时,此代码将打印出无意义的数字,而不是句子的反向版本。我需要帮助定位错误

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

void reverser(char*);
int readmassage(char[], int);

int main()
{
    char mysentence[30];

    readmassage(mysentence, 30);
    reverser(mysentence);
    printf("%s", mysentence);
    system("pause");

    return 0;
}

void reverser(char *massage)
{
    char temp,*p;
    p = massage + strlen(massage)-1;
    while (p > massage) {
        temp = *massage;
        *massage = *p;
        *p-- = temp;
    }
}

int readmassage(char massage[], int lenght)
{
    int ch, i = 0;
    while (ch = getchar() != '\n') {
        if (lenght > i)
            massage[i++] = ch;
    }
    massage[i] = '\0';
    return i;
}

最佳答案

您的问题在这里:

temp = *massage;
*massage = *p;
*p-- = temp;


massage始终指向此处字符串中的第一个字符。因此,您将继续覆盖第一个字符,然后在下一轮中将新的第一个字符写入最后一个字符。结果是,您实际上将字符串旋转了一个字符,而不是将其反转。如果将*massage = *p;更改为*massage++ = *p;(或创建一个新的递增指针变量以对应于您初始化为pmassage),它可能会起作用。

我的意思是需要“按摩字符串的开始”指针。巴邓希什

编辑:并且您还需要更改此,在readmessage中:

while (ch = getchar() != '\n')


至:

while ((ch = getchar()) != '\n')


否则,实际上是根据ch是否返回0来将1设置为getchar()'\n',而不是输入字符。这是因为由于操作的顺序,!=实际上在=之前执行,如果表达式为true,则!=给您1,如果表达式为false,则为0。然后,此01ch运算符存储在=中。

您也可以将所有readmessage替换为fgets,因为它包含在标准库中,并且恰好适合这种情况(当然,除非重新实现它是您分配的一部分)。

09-25 18:50