在C程序中,将句子中最长的回文单词打印出来

1. 前言

在C语言中,有时我们需要寻找一句话中的最长回文单词。回文是指正着和反着读起来都一样的单词,例如“level”和“racecar”等等。本文将介绍一种寻找句子中最长回文单词的方法,该方法使用C语言编写,旨在帮助学习C语言的读者更好地理解字符串的操作。

2. 程序实现

2.1 程序思路

为了找到句子中的最长回文单词,我们可以使用以下方法:

1. 从句子中提取每个单词;

2. 对于每个单词,判断它是否为回文;

3. 如果是回文,并且长度大于之前找到的回文单词的长度,将其作为新的最长回文单词。

为了实现这个方法,我们需要编写一些函数:

- `isPalindrome()`函数:判断传入的字符串是否为回文;

- `getWord()`函数:从句子中提取单词;

- `findLongestPalindrome()`函数:在句子中找到最长回文单词。

2.2 程序代码

下面是一个完整的程序,实现上述思路:

#include <stdio.h>

#include <string.h>

int isPalindrome(char* s);

char* getWord(char* sentence, char* word);

char* findLongestPalindrome(char* sentence);

int main() {

char sentence[1000];

printf("Please enter a sentence:\n");

fgets(sentence, 1000, stdin);

sentence[strlen(sentence) - 1] = '\0'; // remove newline character

char* longestPalindrome = findLongestPalindrome(sentence);

if (longestPalindrome) {

printf("Longest palindrome word: %s\n", longestPalindrome);

} else {

printf("No palindrome words found.\n");

}

return 0;

}

int isPalindrome(char* s) {

int len = strlen(s);

for (int i = 0; i < len / 2; i++) {

if (s[i] != s[len - 1 - i]) {

return 0;

}

}

return 1;

}

char* getWord(char* sentence, char* word) {

static char* p; // static pointer to remember position in sentence

int i = 0;

// skip over whitespace

while (*p == ' ' || *p == '\t') {

p++;

}

// copy characters into word until whitespace or null terminator

while (*p != ' ' && *p != '\t' && *p != '\0') {

word[i++] = *p++;

}

word[i] = '\0';

return word[0] ? word : NULL; // return word if non-empty, else NULL

}

char* findLongestPalindrome(char* sentence) {

char word[100];

char* longestPalindrome = NULL;

for (char* p = sentence; getWord(sentence, word);) {

if (isPalindrome(word)) {

if (!longestPalindrome || strlen(word) > strlen(longestPalindrome)) {

longestPalindrome = word;

}

}

}

return longestPalindrome;

}

2.3 程序解释

我们来一步一步分析程序的实现。程序分为以下步骤:

1. 获取句子;

2. 调用`findLongestPalindrome()`函数找到最长回文单词;

3. 打印找到的回文单词。

以上步骤的具体实现如下。

2.3.1 获取句子

我们通过调用`fgets()`函数从标准输入获取一行字符存入变量`sentence`中,然后用`strlen()`函数移除最后一个字符,即换行符。

char sentence[1000];

printf("Please enter a sentence:\n");

fgets(sentence, 1000, stdin);

sentence[strlen(sentence) - 1] = '\0'; // remove newline character

2.3.2 调用`findLongestPalindrome()`函数找到最长回文单词

下面是`findLongestPalindrome()`函数的代码:

char* findLongestPalindrome(char* sentence) {

char word[100];

char* longestPalindrome = NULL;

for (char* p = sentence; getWord(sentence, word);) {

if (isPalindrome(word)) {

if (!longestPalindrome || strlen(word) > strlen(longestPalindrome)) {

longestPalindrome = word;

}

}

}

return longestPalindrome;

}

该函数使用了`getWord()`函数和`isPalindrome()`函数,我们接下来会一一讲解这些函数。

在`findLongestPalindrome()`函数中,我们用一个指针`p`遍历句子`sentence`中的所有单词。其中`getWord()`函数从句子中提取一个单词,如果函数返回非空指针,表示有单词被提取出来,否则意味着句子结束。

如果`isPalindrome()`函数返回1,表示这个单词是一个回文,接下来我们需要判断它是否为当前找到的最长回文单词。如果是,我们将这个单词赋值给`longestPalindrome`指针。

最后,`findLongestPalindrome()`函数返回`longestPalindrome`指针,即最长回文单词。

2.3.3 判断回文

下面是`isPalindrome()`函数的代码:

int isPalindrome(char* s) {

int len = strlen(s);

for (int i = 0; i < len / 2; i++) {

if (s[i] != s[len - 1 - i]) {

return 0;

}

}

return 1;

}

该函数使用`strlen()`函数获取字符串`s`的长度,然后用一个循环比较字符串元素是否对称。循环的条件是`i < len / 2`,因为我们只需要比较字符串的前一半和后一半是否对称。如果对称,则函数返回1表示这个字符串是回文,否则返回0。

2.3.4 提取单词

下面是`getWord()`函数的代码:

char* getWord(char* sentence, char* word) {

static char* p; // static pointer to remember position in sentence

int i = 0;

// skip over whitespace

while (*p == ' ' || *p == '\t') {

p++;

}

// copy characters into word until whitespace or null terminator

while (*p != ' ' && *p != '\t' && *p != '\0') {

word[i++] = *p++;

}

word[i] = '\0';

return word[0] ? word : NULL; // return word if non-empty, else NULL

}

该函数使用了一个静态指针变量`p`,用于记录当前遍历到句子字符串`sentence`的位置。函数从句子`sentence`中取出一个单词,存入字符串`word`中,并用指针`p`记录下一步遍历到字符串的位置。

首先,我们需要跳过单词前面的所有空格或制表符字符。然后,我们将字符逐个复制到`word`字符串中,直到遇到下一个空格或制表符或字符串结束符。最后,我们在`word`字符串结尾加上一个空字符,并返回指向`word`字符串的指针(或NULL,表示句子字符串s已经结束)。

2.4 程序演示

我们运行程序,输入一个句子,程序将找到最长回文单词并输出:

Please enter a sentence:

She is reading a level book.

Longest palindrome word: level

3. 总结

到这里,我们已经介绍了如何在C语言中找到句子中最长回文单词的方法。我们使用了几个函数,分别用于获取单词、判断回文和找到最长回文单词。这个程序可以进一步优化,例如可以处理特殊字符、大小写等问题。希望本文对读者在学习C语言的过程中有所帮助。

后端开发标签