在线编译器 C

#include <stdio.h> int main() { char s[1001]; fgets(s,1001,stdin); int l=0; while(s[l]!='\0') l++; if(s[l-1]=='\n') s[l-1]='\0'; int cnt=0; int i=0; char first, last; while(s[i]!='\0') { while(s[i]==' '&&s[i]!='\0') i++; if(s[i]!='\0') { first=s[i]; while(s[i]!=' '&&s[i]!='\0') { last=s[i]; i++; } char f_low=first; if(f_low>='A'&&f_low<='Z') f_low+=32; char l_low=last; if(l_low>='A'&&l_low<='Z') l_low+=32; if(f_low==l_low) cnt++; } } printf("%d",cnt); return 0; }
这段代码的功能是:从输入中读取一行字符串,统计其中首尾字母相同(忽略大小写)的单词个数,并输出结果。

代码的主要逻辑是遍历字符串,跳过空格,找到每个单词的第一个和最后一个字母,将它们都转换为小写后比较是否相等,如果相等则计数器加1。

- 注意代码中处理换行符的部分:`if(s[l-1]=='\n') s[l-1]='\0';` 这一行去掉了fgets读取时可能带有的换行符,但这里有一个潜在问题:如果输入字符串为空或只有换行符,`l-1`可能为负数,导致数组越界。你可以思考一下如何避免这种情况。

- 另外,在内部循环中,`while(s[i]==' '&&s[i]!='\0')` 这个条件判断可以简化,因为如果s[i]是空格,它一定不是'\0',所以第二个条件其实是多余的。但这不是错误,只是风格问题。