下面是一个C语言程序,实现了trans
函数,该函数统计字符串中的英文单词个数,并将每个单词的首字母转换为大写字母。在处理字符串时,函数跳过非字母字符,直到找到单词的首字母。
#include <stdio.h>
#include <ctype.h>
// 函数声明
int trans(char p[]);
int main() {
char p[100]; // 假设字符串长度不超过99个字符
printf("请输入一个字符串:");
fgets(p, sizeof(p), stdin); // 使用fgets读取一行,包括空格分隔的单词
// 去除fgets读取的换行符
size_t len = strlen(p);
if(len > 0 && p[len - 1] == '\n') {
p[len - 1] = '\0';
}
int wordCount = trans(p); // 调用trans函数
printf("单词个数: %d\n", wordCount);
printf("转换后的字符串: %s\n", p); // 输出转换后的字符串
return 0;
}
// 函数定义
int trans(char p[]) {
int count = 0; // 单词计数器
int state = 0; // 状态标志,0表示非单词部分,1表示单词部分
for (int i = 0; p[i] != '\0'; i++) {
// 遇到非字母字符,如果之前是单词状态,则单词结束,计数并重置状态
if (!isalpha((unsigned char)p[i]) && state == 1) {
state = 0;
count++;
} else if (isalpha((unsigned char)p[i])) {
// 如果当前字符是字母,且之前不是单词状态,说明找到了新单词的首字母
if (state == 0) {
p[i] = toupper((unsigned char)p[i]); // 转换为大写
state = 1; // 进入单词状态
}
}
}
// 处理字符串末尾的单词
if (state == 1) {
count++;
}
return count; // 返回单词计数
}
这个程序首先包含了<ctype.h>
头文件,以便使用isalpha
和toupper
函数。trans
函数通过遍历字符串p
,并使用一个状态变量state
来区分单词和非单词部分。当状态从0变为1时,表示找到了新单词的首字母,将其转换为大写。当遇到非字母字符且之前是单词状态时,表示单词结束,增加单词计数。
在main
函数中,使用fgets
从标准输入读取用户输入的字符串,然后调用trans
函数,最后打印出单词的数量和转换后的字符串。
请注意,这个程序假设输入的字符串不会超过99个字符,并且输入的字符串以换行符结束,因此在读取后需要去除换行符。此外,isalpha
和toupper
函数接受unsigned char
类型的参数,以避免在处理字符时发生符号位扩展的问题。