易百教程

67、使用C语言在不使用库函数的情况下实现反转字符串。

字符串是字符的集合,它总是以空字符结尾,这意味着每个字符串在字符串的末尾都包含一个空字符。
例子:

char *pszData = “aticle”;

在上面的示例中,pszData 是指向字符串的指针。 字符串的所有字符都存储在一个连续的内存中,并在字符串的最后一个空字符组成。

见下表:

character     ‘a’    ‘t’    ‘i’    ‘c’    ‘l’    ‘e’    ‘\0’
Address     0x00    0x01    0x02    0x03    0x04    0x05    0x06

使用迭代方法反转字符串

方法一:

算法:

  • 计算字符串的长度(Len)。
  • 初始化数组的索引。
  • 开始 = 0,结束 = Len-1
  • 在循环中,将 pszData[Start] 的值与 pszData[End] 交换。
  • 如下更改数组的索引。
  • 开始=开始+1; 结束 = 结束 - 1
#include <stdio.h>
#include <stdlib.h>
int main()
{
    char acData[100]= {0}, Temp = 0;
    int iLoop =0, iLen = 0;
    int cnt =0;
    printf("\nEnter the string :");
    //Maximum takes 100 character
    if (fgets(acData,100,stdin) == NULL)
    {
        printf("Error\n");
        return 1;
    }
    //calculate length of string
    while(acData[iLen++] != '\0');
    //Remove the null character
    iLen--;
    //Array index start from 0 to (length -1)
    iLen--;
    while (iLoop < iLen)
    {
        Temp = acData[iLoop];
        acData[iLoop] = acData[iLen];
        acData[iLen] = Temp;
        iLoop++;
        iLen--;
    }
    printf("\nReverse string is : %s",acData);
    return 0;
}

方法2:

#include <stdio.h>
#include <stdlib.h>
#define SWAP_CHARACTER(a,b)  do { \
    (*a)^=(*b); \
    (*b)^=(*a);\
    (*a)^=(*b);\
    a++; \
    b--; \
    }while(0);
int main(int argc, char *argv[])
{
    char acData[100]= {0};
    char *pcStart = NULL;
    char *pcEnd = NULL;
    int iLoop =0, iLen = 0;
    printf("\nEnter the string :");
    //Maximum takes 100 character
    if (fgets(acData,100,stdin) == NULL)
    {
        printf("Error\n");
        return 1;
    }
    //Pointer point to the address of first character
    pcStart = acData;
    // calculate length of string
    while(acData[iLen++] != '\0');
    //Remove the null character
    iLen--;
    pcEnd = (pcStart + iLen-1);
    while (iLoop < iLen/2)
    {
        SWAP_CHARACTER (pcStart,pcEnd);
        iLoop++;
    }
    printf("\nReverse string is : %s
\n",acData);
    return 0;
}

反转字符串的递归方法

算法:

  • 计算字符串的长度(Len)。
  • 初始化数组的索引。
  • 开始 = 0,结束 = Len-1
  • pszData[Start] 的值与 pszData[End] 交换。
  • 如下更改数组的索引,并递归调用其余数组的反向函数。
  • Start = start +1; End = end – 1
#include <stdio.h>
#include <stdlib.h>
//recursive function
void StringRev(char *pszInputData, unsigned int Start, unsigned int End)
{
    if(Start >= End)
    {
        return 1;
    }
    // swap the data
    *(pszInputData + Start) = *(pszInputData + Start) ^ *(pszInputData + End);
    *(pszInputData + End) = *(pszInputData + Start) ^ *(pszInputData + End);
    *(pszInputData + Start) = *(pszInputData + Start) ^ *(pszInputData + End);
    //function called repeatedly
    StringRev(pszInputData,Start+1, End-1);
}
int main(int argc, char *argv[])
{
    char acData[100]= {0};
    int  iLen = 0;
    unsigned int Start=0;
    printf("\nEnter the string :");
    //Maximum takes 100 character
    if (fgets(acData,100,stdin) == NULL)
    {
        printf("Error\n");
        return 1;
    }
    // calculate length of string
    while(acData[iLen++] != '\0');
    //Remove the null character
    iLen--;
    //Find array last index
    iLen--;
    StringRev(acData,Start, iLen);
    printf("\nReverse string is : %s
\n",acData);
    return 0;
}