📌  相关文章
📜  C程序反转给定字符串中的单词(1)

📅  最后修改于: 2023-12-03 14:40:26.651000             🧑  作者: Mango

C程序反转给定字符串中的单词

本文将介绍如何编写C程序来反转给定字符串中的单词。

需求背景

在很多情况下,我们需要把输入的字符串反转。常见的场景包括字符串加密、用户在网站上输入密码、处理日志文件等。

需求分析

我们需要完成以下功能:

  • 反转给定的字符串;
  • 反转字符串中的每个单词。

因此,我们需要实现两个函数:

void reverse(char* str);
void reverseWords(char* str);
reverse()函数

reverse()函数将反转任何给定的字符串,例如:

char str[] = "Hello World!";
reverse(str);
printf("%s\n", str); // 输出 "!dlroW olleH"
reverseWords()函数

reverseWords()函数将反转字符串中的每个单词,例如:

char str[] = "Hello World!";
reverseWords(str);
printf("%s\n", str); // 输出 "olleH !dlroW"
实现过程
reverse()函数

reverse()函数可以使用双指针的方法来实现。我们将第一个指针指向字符串的开头,第二个指针指向字符串的末尾。然后,我们交换它们所指向的字符,并分别向字符串的中间移动两个指针,直到它们相遇为止。例如:

void reverse(char* str) {
    char* start = str;
    char* end = str + strlen(str) - 1;
    while (start < end) {
        char temp = *start;
        *start++ = *end;
        *end-- = temp;
    }
}
reverseWords()函数

reverseWords()函数是比较复杂的。我们可以通过以下步骤来完成该函数:

  1. 反转整个字符串;
  2. 反转每个单词。

例如:

void reverseWords(char* str) {
    // 反转整个字符串
    reverse(str);
    
    // 反转每个单词
    char* wordStart = NULL;
    char* p = str;
    while (*p) {
        if (wordStart == NULL && !isspace(*p)) {
            wordStart = p;              // 记录单词开始位置
        } else if (wordStart != NULL && (isspace(*p) || *p == '\0')) {
            reverse(wordStart);         // 反转单词
            wordStart = NULL;           // 重置
        }
        p++;
    }
    // 处理最后一个单词
    if (wordStart != NULL) {
        reverse(wordStart);
    }
}
总结

本文介绍了如何编写C程序来反转字符串中的单词。我们实现了reverse()函数和reverseWords()函数来反转字符串和单词。

在实现该功能时,我们使用了双指针和字符串处理函数等技术。这些技术是C程序员必须掌握的基本知识点。

完整代码如下:

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

void reverse(char* str) {
    char* start = str;
    char* end = str + strlen(str) - 1;
    while (start < end) {
        char temp = *start;
        *start++ = *end;
        *end-- = temp;
    }
}

void reverseWords(char* str) {
    // 反转整个字符串
    reverse(str);
    
    // 反转每个单词
    char* wordStart = NULL;
    char* p = str;
    while (*p) {
        if (wordStart == NULL && !isspace(*p)) {
            wordStart = p;              // 记录单词开始位置
        } else if (wordStart != NULL && (isspace(*p) || *p == '\0')) {
            reverse(wordStart);         // 反转单词
            wordStart = NULL;           // 重置
        }
        p++;
    }
    // 处理最后一个单词
    if (wordStart != NULL) {
        reverse(wordStart);
    }
}

int main() {
    char str[] = "Hello World!";
    reverse(str);
    printf("%s\n", str); // 输出 "!dlroW olleH"
    
    char str2[] = "Hello World!";
    reverseWords(str2);
    printf("%s\n", str2); // 输出 "olleH !dlroW"
    return 0;
}