📜  C测验– 102 |问题3(1)

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

C测验– 102 |问题3

该测验是一份针对C语言程序员的练习题,问题3要求实现一个函数,将字符串中的单词反转。这道题考察了C语言的字符串处理和循环语句的使用。下面是函数的函数签名和具体要求:

void reverse_words(char *s);

要求实现一个函数,将一个字符串中的单词反转。例如:对于字符串 "hello world",翻转后应该为 "world hello"。

下面是函数的一些要点和思路:

  1. 首先要对字符串进行预处理,将其中多余的空格去掉,保证相邻两个单词之间只有一个空格。
  2. 使用循环逐个处理字符串中的每个单词,每次处理到一个单词就将其反转。
  3. 在反转单词时需要两个指针来完成,一个指向单词的开头,一个指向单词的结尾,然后逐个交换两个指针所指的字符即可。

下面是题目的代码实现:

void reverse_words(char *s) {
    int len = strlen(s);

    // 去掉字符串中的多余空格
    int i, j;
    for (i = 0, j = 0; i < len; ) {
        while (s[i] == ' ') i++; // 找到下一个单词的起始下标
        if (i == len) break;

        if (j) s[j++] = ' '; // 在单词与单词之间添加一个空格
        while (s[i] && s[i] != ' ') { // 反转单词
            s[j++] = s[i++];
        }
        // 反转单词
        int l = j - 1;
        for (int k = j - (i - j); k < l; k++, l--) {
            char t = s[k];
            s[k] = s[l];
            s[l] = t;
        }
    }
    s[j] = '\0'; // 给字符串结尾添加一个 NULL
}

代码注释比较详细,可以帮助理解程序。