如何在C语言中颠倒句子? [关闭]

问题描述 投票:-4回答:3

我有一个单词,如word1。

我该怎么办?

c copy reverse c-strings function-definition
3个回答
0
投票

您要复制

Source         Destin.
position       position
--------       --------
    0     -->     13
    1     -->     12
    2     -->     11
           ⋮
   11     -->      2
   12     -->      1
   13     -->      0

是什么关系?好吧,目标位置是13减去源位置。

13是什么?好吧,它比字符串的长度小1。

因此,

  1. 确定length中字符串的长度(w1
  2. [对于从i0的每个索引(length-1),
    1. 获取i的元素w1
    2. 将检索到的char存储到length-i-1的元素w2中。
  3. 将NUL存储到length的元素w2中。

0
投票

最简单的解决方案是从w1的末尾扫描并将字符复制到w2,然后最后在\0的末尾添加空字符w2

void rev(char *w1, char *w2) {

    int len = strlen(w1);
    for(int i = 0,k=len-1 ; i < len; i++,k--) {
        w2[i] = w1[k];
    }
    w2[len] = '\0';

}

完整的测试代码:

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

void rev(char *w1, char *w2) {

    int len = strlen(w1);
    for(int i = 0,k=len-1 ; i < len; i++,k--) {
        w2[i] = w1[k];
    }
    w2[len] = '\0';

}

int main()
{
    char *word1 = "Im a guitarist";
    char word2[30];
    rev(word1, word2);
    puts(word2);

    return 0;
}

输出:

tsiratiug a mI

0
投票

实际上,该功能不会颠倒句子。它以相反的顺序将一个句子复制到一个字符数组。

最好命名这样的函数,例如reverse_copy。该函数应返回指向反向字符串的指针。

该功能可以通过不同的方式实现。这里显示了其可能的定义之一。

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

char * reverse_copy( char *s1, const char *s2 )
{
    size_t n = strlen( s2 );

    s1[n] = '\0';

    for ( char *p = s1; n--; ++p )
    {
        *p = s2[n];
    }

    return s1;
}

int main(void) 
{
    char *word1 = "Im a guitarist";
    char word2[30]; 

    puts( reverse_copy( word2, word1 ) );

    return 0;
}

程序输出为

tsiratiug a mI

或者例如,可以使用较少的局部变量来编写函数代码

char * reverse_copy( char *s1, const char *s2 )
{
    size_t n = strlen( s2 );

    s1[n] = '\0';

    while ( n-- )
    {
        s1[n] = *s2++;
    }

    return s1;
}

在体内,该函数仅声明了一个局部变量n

© www.soinside.com 2019 - 2024. All rights reserved.