写一个C程序来反转一个字符串,不使用库函数

1. 程序简介

本篇文章将介绍如何使用C语言编写一个字符串反转程序,实现将输入的字符串反转输出。在本程序中,我们将使用循环和指针来完成字符串反转的功能。为了方便理解,本程序将分为两个函数来实现,分别是实现字符串反转功能的函数和输出结果的函数。

2. 反转字符串的函数实现

2.1 程序思路

在反转字符串的函数中,我们将使用两个指针变量p和q,分别指向字符串的首字符和尾字符。通过循环来交换p和q指向的字符,直至p指向的位置大于等于q指向的位置为止。

具体的步骤如下:

初始化指针变量p和q,分别指向字符串的首字符和尾字符;

通过循环不断交换p和q指向的字符,直至p指向的位置大于等于q指向的位置;

若字符串长度为奇数,则当p指向的位置大于q指向的位置时,交换p和q指向的字符;

最终返回反转后的字符串。

2.2 代码实现

/* 反转字符串函数 */

char* reverse_string(char* str)

{

char* p = str; // 指向字符串首字符

char* q = str + strlen(str) - 1; // 指向字符串尾字符

while (p < q) { // 循环交换字符

char temp = *p;

*p = *q;

*q = temp;

++p;

--q;

}

return str;

}

2.3 程序测试

下面我们将编写一个简单的主函数来测试字符串反转函数。

#include <stdio.h>

#include <string.h>

/* 反转字符串函数 */

char* reverse_string(char* str);

/* 输出结果函数 */

void print_result(char* str);

int main()

{

char str[50]; // 定义一个字符串数组,存储输入的字符串

printf("请输入一个字符串:");

scanf("%s", str);

char* result = reverse_string(str); // 调用反转字符串函数

print_result(result); // 输出结果

return 0;

}

/* 输出结果函数 */

void print_result(char* str)

{

printf("反转后的字符串为:%s\n", str);

}

通过运行上述代码,可以输入一个字符串,程序将输出反转后的字符串。

3. 输出结果的函数实现

3.1 程序思路

在输出结果的函数中,我们将对输入的字符串进行判断,若字符串为空,则输出提示信息;若字符串不为空,则输出反转后的字符串。

具体的步骤如下:

判断输入的字符串是否为空;

若字符串不为空,则输出反转后的字符串;

若字符串为空,则输出提示信息。

3.2 代码实现

/* 输出结果函数 */

void print_result(char* str)

{

if (strlen(str) == 0) { // 判断输入的字符串是否为空

printf("您没有输入任何字符!\n");

} else {

printf("反转后的字符串为:%s\n", str); // 输出反转后的字符串

}

}

3.3 程序测试

下面我们将修改主函数,将输出结果的函数加入到主函数中,测试输出结果的函数是否能够正常运行。

#include <stdio.h>

#include <string.h>

/* 反转字符串函数 */

char* reverse_string(char* str);

/* 输出结果函数 */

void print_result(char* str);

int main()

{

char str[50]; // 定义一个字符串数组,存储输入的字符串

printf("请输入一个字符串:");

scanf("%s", str);

char* result = reverse_string(str); // 调用反转字符串函数

print_result(result); // 输出结果

return 0;

}

/* 输出结果函数 */

void print_result(char* str)

{

if (strlen(str) == 0) { // 判断输入的字符串是否为空

printf("您没有输入任何字符!\n");

} else {

printf("反转后的字符串为:%s\n", str); // 输出反转后的字符串

}

}

通过运行上述代码,可以输入一个字符串,程序将输出反转后的字符串,若输入的字符串为空,则程序将输出提示信息。

4. 程序优化

在程序运行过程中,有可能会输入过长的字符串,导致数组越界等问题。为了避免这种情况的发生,我们可以使用动态内存分配的方式来分配内存,并在使用完毕后及时释放内存。

4.1 代码实现

/* 反转字符串函数 */

char* reverse_string(char* str)

{

int len = strlen(str);

char* p = malloc(sizeof(char) * (len + 1)); // 动态分配内存

strcpy(p, str);

char* q = p + len - 1;

while (p < q) {

char temp = *p;

*p = *q;

*q = temp;

++p;

--q;

}

return p - len; // 返回反转后的字符串

free(p); // 释放内存

}

4.2 程序测试

为了测试程序优化后是否能够正常运行,我们将修改主函数,并输入一个长度较长的字符串。

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

/* 反转字符串函数 */

char* reverse_string(char* str);

/* 输出结果函数 */

void print_result(char* str);

int main()

{

char* str = NULL;

size_t len = 0;

printf("请输入一个字符串:");

getline(&str, &len, stdin); // 使用动态内存分配的方式读取字符串

char* result = reverse_string(str);

print_result(result);

free(str); // 释放内存

return 0;

}

/* 输出结果函数 */

void print_result(char* str)

{

if (strlen(str) == 0) {

printf("您没有输入任何字符!\n");

} else {

printf("反转后的字符串为:%s\n", str);

}

}

通过运行上述代码,可以输入一个长度较长的字符串,程序将使用动态内存分配的方式来分配内存,并在使用完毕后及时释放内存。

5. 程序扩展

为了更好的使用本程序,我们可以扩展程序的功能,支持字符串中单词的反转。

5.1 程序思路

在单词反转的函数中,我们将使用三个指针变量p、q和s,分别指向单词的首字母、尾字母和单词后面的空格。通过循环来实现单词的反转,直至s指向字符串末尾为止。

具体的步骤如下:

初始化指针变量p、q和s,将p和q都指向s所指向的空格之后的单词的首字母;

通过循环不断交换p和q指向的字符,直至p指向的位置大于等于q指向的位置;

每次交换完成后,将p和q都向前移动一个位置,指向下一个单词的首字母和尾字母;

将s指向下一个空格,即下一个单词的结束位置,若s已经指向字符串末尾,则停止循环。

5.2 代码实现

/* 反转单词函数 */

void reverse_words(char* str)

{

char* p = str;

char* q = str;

char* s = str;

while (*s != '\0') {

while (*s == ' ') { // 将s指向下一个单词的后面的空格

++s;

}

if (*s == '\0') { // 判断是否到达字符串末尾

break;

}

p = q = s; // 将p和q都指向下一个单词的首字母

while (*q != ' ' && *q != '\0') { // 将q指向下一个单词的尾字母

++q;

}

--q; // 将q指向下一个单词的末尾字符

while (p < q) { // 循环交换单词

char temp = *p;

*p = *q;

*q = temp;

++p;

--q;

}

s = q + 2; // 将s指向下一个空格,即下一个单词的结束位置

}

}

5.3 程序测试

为了测试程序扩展后是否能够正常运行,我们将修改主函数,并输入一个包含多个单词的字符串。

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

/* 反转字符串函数 */

char* reverse_string(char* str);

/* 反转单词函数 */

void reverse_words(char* str);

/* 输出结果函数 */

void print_result(char* str);

int main()

{

char* str = NULL;

size_t len = 0;

printf("请输入一个字符串:");

getline(&str, &len, stdin);

reverse_words(str); // 反转单词

char* result = reverse_string(str); // 反转字符串

print_result(result);

free(str);

return 0;

}

/* 输出结果函数 */

void print_result(char* str)

{

if (strlen(str) == 0) {

printf("您没有输入任何字符!\n");

} else {

printf("反转后的字符串为:%s\n", str);

}

}

通过运行上述代码,可以输入一个多个单词的字符串,程序将先反转单词,再将整个字符串反转,最终输出反转后的字符串。

6. 总结

本篇文章介绍了如何使用C语言编写一个字符串反转程序,主要介绍了字符串反转函数和输出结果函数的实现,并对程序进行了优化,使用动态内存分配的方式避免了数组越界等问题。为了更好的使用本程序,我们还对程序进行了扩展,支持了字符串中单词的反转。

后端开发标签