字符数组

来源:互联网 发布:电视直播软件v7.3.4 编辑:程序博客网 时间:2024/06/06 11:00

将 I am from ShangHai 转换为 ShangHai from am I

这道题的思路是先将这句I am from ShangHai 转换为iaHgnaS morf ma I

再将每个单词依次倒转

这题比较长,应该分次写

#include <stdio.h>

#include <string.h>


void re(char str[], int len);

int main()
{
    char str[] = "I am from ShangHai";
    int len = strlen(str);                 //算出字符数组长度
    re(str, len);                             //调用re函数
    printf("first : |%s|\n", str);       //第一次输出
  
    return 0;
}


void re(char str[], int len)
{
    int i;
    char temp;
    for (i = 0; i < len / 2; i++)     /*这里前后倒换len/2次,(若有三个元素,a[0]与a[2]交换,a[1]不变,交换1次,若有4个元素,a[0],a[3]交换,a[1],a[2]交换,交换两次)*/
    {
        temp = str[i];                          //前后交换
        str[i] = str[len - 1 - i];
        str[len - 1 - i] = temp;
    }    
}

输出|iaHgnaS morf ma I|

第二次

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


void re(char str[], int len);
void re2(char str[]);


int main()
{
    char str[] = "I am from ShangHai";
    int len = strlen(str);
    re(str, len);
    printf("first : |%s|\n", str);
  
    return 0;
}


void re(char str[], int len)
{
    int i;
    char temp;
    for (i = 0; i < len / 2; i++)
    {
        temp = str[i];
        str[i] = str[len - 1 - i];
        str[len - 1 - i] = temp;
    }    
}
void re2(char str[])
{
    int index = 0;
    int len = 0; 
    int start = 0;
    for (index = 0; index <= strlen(str); index++)              /*这里需要将字符串中的'\0'也输入,所以index也需要等于字符串长度*/
    {
        if (str[index] != ' ' && str[index] != '\0')                  /*当字符数组没有查到‘ ’和‘\0’时,即为没有查出一个单词的长度,长度len自加1*/
        {
            len++;
        }
        else 
        {
            printf("start : %4d len : %4d\n", start, len);          //输出单词的起始位数和单词长度
            start = start + len + 1;                               //单词起始的位数是上一个起始位数加上上个单词长度再加一
            len = 0;                                                 //单词长度归零
        }
    }
}

输出

start :0 len :8

start :9 len :4

start :14 len :2

start :17 len :1

第三次

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


void re(char str[], int len);
void re2(char str[]);


int main()
{
    char str[] = "I am from ShangHai";
    int len = strlen(str);
    re(str, len);
    printf("first : |%s|\n", str);
    re2(str);                  //  调用re2函数
    printf("second : |%s|\n", str);   输出第三次处理后的字符数组
  
    return 0;
}


void re(char str[], int len)
{
    int i;
    char temp;
    for (i = 0; i < len / 2; i++)
    {
        temp = str[i];
        str[i] = str[len - 1 - i];
        str[len - 1 - i] = temp;
    }    
}
void re2(char str[])
{
    int index = 0;
    int len = 0; 
    int start = 0;
    for (index = 0; index <= strlen(str); index++)
    {
        if (str[index] != ' ' && str[index] != '\0')
        {
            len++;
        }
        else 
        {
            printf("start : %4d len : %4d\n", start, len);
            re(str + start, len);                 //调用re函数,起始位数加上第一次处理后的字符数组名就是各个单词的首地址
            start = start + len + 1;
            len = 0;
        }
    }
}

输出

|ShangHai from am I|

此题要注意边界值

0 0