仅反转字符串中的某些单词

我有一个名称为“ Mustang Sally Bob”的字符串 运行代码后,我希望字符串输出像这样:gnatsuM yllaS boB 我的方法是对单词进行计数,直到空格为止,然后保存字符串中空格位置的索引。然后我要从空格开始向后打印字符。

#include <stdio.h>

int main()
{
    char* test="Mustang Sally Bob";

    int length; //string length
    int x;
    for(length=0;test[length] !=0&&test[length];length++); //get string length
    int counter;
    int words = 0;
    int space_index =0;
    for(counter=0;counter<length;counter++) {
        words++;
        if(test[counter]==' ') {
            space_index=counter;
            for(x=space_index-1;x>=words;x--) {
                printf("%c",test[x]);
            }
            words=0;    
            space_index = 0;
        }
    }

    return 0;
}

但是执行此代码时,我得到的输出是yllaS g 有谁知道为什么我无法获得完整的字符串?

nut0032 回答:仅反转字符串中的某些单词

通常,这种方法是不正确的。

例如,任意字符串可以以空格开头。在这种情况下,将不会输出前导空白。

如果最后一个单词之后没有空格,则会将其忽略。

变量words不能保持单词开始的位置。

通过此循环计算字符串的长度

for(length=0;test[length] !=0&&test[length];length++);

可以写得更简单

for ( length = 0; test[length] != '\0' ; length++ );

是多余的。您始终可以依靠这样的事实,即字符串以零终止字符'\0'终止。

我可以提出以下解决方案

#include <stdio.h>

int main( void )
{
    const char *test = "Mustang Sally Bob";

    for ( size_t i = 0; test[i] != '\0'; )
    {
        while ( test[i] == ' ' ) putchar( test[i++] );

        size_t j = i;

        while ( test[i] != '\0' && test[i] != ' ' ) i++;

        for ( size_t k = i; k != j; ) putchar( test[--k] );
    }

    return 0;
}

程序输出为

gnatsuM yllaS boB

如果愿意,可以在程序后附加制表符'\t'。在C中,有一个标准的C函数isblank执行这种检查。

这里是一个使用功能isblank的演示程序。我还更改了原始字符串文字。

#include <stdio.h>
#include <ctype.h>

int main( void )
{
    const char *test = " Mustang\tSally\tBob ";

    puts( test );

    for ( size_t i = 0; test[i] != '\0'; )
    {
        while ( isblank( ( unsigned char )test[i] ) ) putchar( test[i++] );

        size_t j = i;

        while ( test[i] != '\0' && !isblank( ( unsigned char)test[i] ) ) i++;

        for ( size_t k = i; k != j; ) putchar( test[--k] );
    }

    putchar( '\n' );

    return 0;
}

程序输出为

 Mustang    Sally   Bob 
 gnatsuM    yllaS   boB
本文链接:https://www.f2er.com/2983629.html

大家都在问