Online Compiler C

#include<stdio.h> const int M=1000; char N(char c) { if(c>='A'&&c<='Z') { return c=c+32; } } int main() { int count=0; char str[M+1]; int i=0; char ch; while((ch=getchar())!='\n') { str[i]=ch; i++; } str[i]='\0'; int k=0; char first; char last; while(str[k]!='\0') { k++; } if(str[k]==' ') { k++; char first=str[k]; } if(str[k]=='\0') { k--; char last=str[k]; } if(N(first)==N(last)) { count++; } printf("%d",count); return 0; }
这段代码试图判断输入字符串中第一个非空格字符和最后一个非空格字符是否相同(忽略大小写),但存在多个逻辑错误。

- 在计算字符串长度后,你尝试用 `if(str[k]==' ')` 和 `if(str[k]=='\0')` 来定位首尾字符,但此时 `k` 已经指向字符串末尾的 `'\0'`,这些条件判断的位置不对,而且你在条件内部重新声明了局部变量 `first` 和 `last`,这不会修改外层同名变量,导致外层 `first` 和 `last` 未被赋值。
- 外层 `first` 和 `last` 变量声明后从未被正确赋值,因此后续比较会使用未初始化的值,结果不可预测。

- 思考如何在不修改原字符串的情况下,直接找到第一个非空格字符和最后一个非空格字符的索引位置,而不是先计算长度再回头处理。
- 注意变量作用域:在 `if` 或 `while` 内部声明的变量只在该块内有效,不能用于外部。