有几个问题需要修正:
1. char a[80][3] 应该修改为 char a[3][80],表示三句话,每句话最多80个字符。
2. gets 函数存在安全风险,推荐使用 fgets 替代。
3. strlen 返回的长度是不包括字符串结尾的空字符的,所以在内层循环中应该用 < 而不是 <=。
以下是修改后的代码:#include <stdio.h>#include <string.h>int main() { char a[3][80]; int j, i, x, y, z; for (j = 0; j < 3; j++) { fgets(a[j], 80, stdin); } for (j = 0; j < 3; j++) { x = 0, y = 0, z = 0; for (i = 0; i < strlen(a[j]); i++) { if (a[j][i] >= '0' && a[j][i] <= '9') { x++; } else if ((a[j][i] >= 'A' && a[j][i] <= 'Z') || (a[j][i] >= 'a' && a[j][i] <= 'z')) { y++; } else { z++; } } printf("Line %d: digit: %d, char: %d, other: %d\n", j + 1, x, y, z); } return 0;}
上述代码进行了如下修改:
1. 将 char a[80][3] 修改为 char a[3][80]。
2. 使用 fgets 替代 gets。
3. 将内层循环的条件修改为 i < strlen(a[j])。
这样修改后的代码应该可以正确统计每句话中的英文字母、数字和其他字符的个数。希望对你有帮助! |