我对编程还比较新手。我的 “CountSentences”函数有些问题。我将字符串与“。”、“?”和“!”进行比较,以计算句子数。但无论我在字符串中有多少个标点符号,它只会将一个加到句子计数器中。我是否使用了strcmp不当来获取所需的结果?是否有其他方法可以解决这个问题?
#include<cs50.h> #include<ctype.h> #include<string.h> #include<math.h>
//计算字符数的函数 int count_letters(string s) { int numberofLetters = 0; // 计数器
//循环直至字符串长度 for(int i = 0, n = strlen(s); i < n; i++) { //如果字符是字母数字 if(isalnum(s[i]) != 0) { numberofLetters++; //增加计数器数量 }; }; return numberofLetters; //返回新计数器数量 };
//计算单词数的函数 int count_Words(string w) { int numberofWords = 0;//声明单词计数器 int i = 0; // 字符串中字符的计数器
if(w == NULL) // 如果为空 { return numberofWords; // 返回单词数为0的计数器 };
bool spaces = true; //用于表示空格的真值
//如果字符不是空字符 while(w[i] != '\0') {
if(isblank(w[i]) != 0) //如果字符为空格 { spaces = true; //是空格 } else if(spaces) //如果没有空格并且有字母,则添加到单词中 { numberofWords++; // 增加单词计数器 spaces = false; }; i++;// 增加字符串w中的字符计数器
};
return numberofWords; //返回总单词计数器 };
//函数来计算句子数量 int count_Sentences(string l) { //变量统计标点符号 int countMarks = 0;
//循环迭代使用字符串中的字符数 for(int i = 0, n = strlen(l); i < n; i++) { //检查是否为 ? , . , or ! if(strcmp(&l[i], "!") == 0 || strcmp(&l[i], ".") == 0 || strcmp(l, "?") == 0) { countMarks++;// 统计句子数 };
}; // 返回总标点符号数 return countMarks; };
int main (void) { string text = get_string ("Text: ");
//检查函数错误 printf("Number of letters: %i\n", count_letters(text)); printf("Number of words: %i\n", count_Words(text)); printf("Number of sentences: %i\n", count_Sentences(text));
//Coleman Liau指数 int grade = round(0.0588 * (100 * (count_letters(text)) / (count_Words(text))) - 0.296 * (100 *(count_Sentences(text)) / (count_Words(text))) - 15.8 );
if(grade <= 1) { printf("Before Grade 1\n"); } else if(grade < 16) { printf("Grade %i\n", grade); } else { printf("Grade 16+\n"); }; };
if(l[i] == '!')
等方式。另外:不建议使用变量名l
(字母L),因为它很容易与数字1混淆,这会使代码难以阅读并容易出错。 - Weather Vanectype.h
中声明的函数族ispunct()
、isspace()
、isalpha()
等感兴趣。 - Weather Vane}; };
不要在闭合大括号}
后面加上分号;
。 - user3629249#include <stdio.h>
用于printf()
等函数。 - user3629249if(strcmp(&l[i], "!") == 0 || strcmp(&l[i], ".") == 0 || strcmp(l, "?") == 0)
这段代码是无法工作的,因为l[]
中的单个字符并不是字符串。建议修改为:if( l[i] == '!' || l[i] == '.' || i[i] == '?' )
请注意这里使用了单引号而非双引号来比较字符而非字符串,并且适当添加了水平空格以提高可读性。 - user3629249