我对编码很新,目前正在注册学校的C课程。我们的任务要求如下:
编写一个输入三行文本的程序,并使用函数strchr
来确定字母表中每个字母的出现次数(大写和小写应该统计为相同)。将每个字母的总数存储在一个数组中并打印结果。
这是我到目前为止编写的代码:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define SIZE 100
int main(void) {
int alphabet[26] = { 0 };
char string[3][SIZE];
int i, j;
int c;
printf("Enter three lines of text:\n");
for (i = 0; i <= 2; i++) {
fgets(string[i], SIZE, stdin);
}
for (i = 0; i <= 2; i++) {
for (j = 0; &string[i][j] != '\0'; j++) {
string[i][j] = tolower(string[i][j]);
}
for (j = 0; &string[i][j] != '\0'; j++) {
if (strchr(&string[i][j], ('a' + j)) != NULL) {
alphabet[j]++;
}
}
}
printf("\n");
for (i = 0; i < 26; i++) {
printf("%c: %d\n", ('a' + i), alphabet[i]);
}
printf("\n");
return 0;
}
我当前程序的问题是数组alphabet[]
的计数器似乎没有正确递增计数。
例如,对于每个字母的每次出现,输出应该计数增加1,但结果都是0。
非常感谢任何其他提示或建议的话语!
答案 0 :(得分:1)
您对行尾的测试是错误的,
无需循环几次只需解析字符串并计算字母数
你想要'a'
和'z'
之间的字母,检查字符是否在范围内并计算它
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#define SIZE 100
int main(void) {
int alphabet[26] = { 0 };
char string[3][SIZE];
int i, j;
printf("Enter three lines of text:\n");
for (i = 0; i <= 2; i++) {
fgets(string[i], SIZE, stdin);
}
for (i = 0; i <= 2; i++) {
for (j = 0; string[i][j] != '\0'; j++) {
char c = tolower(string[i][j]);
if (c >= 'a' && c <= 'z') {
alphabet[c - 'a']++;
}
}
}
printf("\n");
for (i = 0; i < 26; i++) {
printf("%c: %d\n", ('a' + i), alphabet[i]);
}
printf("\n");
return 0;
}
答案 1 :(得分:0)
您需要从&amp; string [i] [j]!=&#39; \ 0&#39 ;;更改循环终止条件to string [i] [j]!=&#39; \ 0&#39 ;; strchr将从找到匹配的字符串返回地址,因此您应该保存非null地址以将其传递给下一次调用strchr 像这样:
tmpPtr = &string[i][j];
while ((tmpPtr=strchr(tmpPtr, string[i][j])) != NULL) {
alphabet[string[i][j] - 'a']++;
}