如何使用“。”,“?”,“!”计算C中的句子数?

Posted

技术标签:

【中文标题】如何使用“。”,“?”,“!”计算C中的句子数?【英文标题】:How do I count the number of sentences in C using ".", "?", "!"? 【发布时间】:2020-10-16 06:41:52 【问题描述】:

我对编码还很陌生。我的“CountSentences”功能有问题。我将字符串与“。”进行比较,“?” , 和 !数一个句子。无论字符串中有多少标点符号,它只会在句子计数器中添加一个。我是否错误地使用 strcmp 来获得我想要的结果,还有其他方法可以解决这个问题吗?

#include #include #include #include //字母计数函数 int count_letters(string s) int numberofLetters = 0; // 柜台 //循环只要字符串长度 for(int i = 0, n = strlen(s); i

【问题讨论】:

您的代码将输入的所有 rest 与单字符字符串进行比较。我建议if(l[i] == '!') 等。除此之外:不建议使用l(字母ELL)作为变量名。它很容易与 1(数字 ONE)混淆,使代码难以阅读,容易出错。 您可能想了解ispunct()isspace()isalpha()等函数族,在ctype.h中声明。 关于:` ; ;` 不要在右大括号 之后放置分号 ; 贴出的代码中缺少声明:#include <stdio.h> for the printf() and similar functions 关于:if(strcmp(&l[i], "!") == 0 || strcmp(&l[i], ".") == 0 || strcmp(l, "?") == 0) 这将不起作用,因为来自l[] 的单个字符不是字符串。建议:if( l[i] == '!' || l[i] == '.' || i[i] == '?' ) 注意使用单引号而不是双引号,以便比较字符而不是字符串。请注意使用适当的水平间距以提高可读性。 【参考方案1】:
    if(strcmp(&l[i], "!") == 0  || strcmp(&l[i], ".") == 0  ||  strcmp(l, "?") == 0)

strcmp 比较两个字符串。在 C 中,我们的“字符串”本质上是“从指针指向的位置开始的 char 大小的数据,一直持续到空终止符”。 cs50 库并没有改变这一点,也没有给你一个真正的字符串类型;它只提供了一个 typedef 和一些用于读取输入的辅助函数。 (遗憾的是,它也没有而且实际上不能给你一个真正的 text character 类型,char 也是 not;但这超出了这个答案的范围.)

&l[i] 是指向l 字符串中间的指针,从偏移量i 开始。当strcmp 使用该指针时,它会将“字符串”视为从该字符到原始字符串末尾的所有内容 - 因为那是空终止符所在的位置。特别是,它 not 将单个 l[i] 字符视为一个单独的字符串,一般来说,因为下一个字符通常不是空终止符。所以,

无论字符串中有多少标点符号,它只会在句子计数器上加一个。

事实上,它甚至只添加了一个,因为您的字符串以其中一个标记结尾。

要比较单个字符,请勿使用strcmp。它既不适合也不适合该目的。 char 是一个单一的实体,因此可以与 == 进行比较。你只需要在比较的两边都有适当的东西。

回想一下,在 C 中,单引号用于 char 字面量,索引到 char 数组(等效地,“索引”到 char 指针,执行等效的指针运算)给你一个 char。因此:

if (l[i] == '!' || l[i] == '.' || l[i] == '?')

【讨论】:

旁白:“C 单引号用于字符文字” --> 在 C 中,'!' 是一个字符常量。 C 定义了 2 个 literalsstringcompound,但没有 char literal。与 constant 不同,两者都可以获取地址。在 C 中,'!'int 类型。 strchr 适合很多孔【参考方案2】:

您确实需要查看 one 字符 l[i] 是否是 .?! 中的任何一个。为此,您可以测试它是否等于这些字符常量中的任何一个,即l[i] == '!' || l[i] == '.' || l[i] == '?'

或者您可以使用函数strchr,它将在给定字符串中查找给定字符并返回指向该字符的指针,如果未找到该字符,则返回空指针。在if 中,空指针将被视为假,非空指针将被视为真。所以我们可以在字符串".?!"中寻找l[i]

if (strchr(".?!", l[i])) 
    ...

【讨论】:

这在l[i] != 0 时效果很好,这不能归因于之前的n = strlen(l); i < n; 因为strchr(".?!", 0) 也不是-NULL

以上是关于如何使用“。”,“?”,“!”计算C中的句子数?的主要内容,如果未能解决你的问题,请参考以下文章

算法2114. 句子中的最多单词数(java / c / c++ / python / go / rust)

算法2114. 句子中的最多单词数(java / c / c++ / python / go / rust)

计算包含来自其他列表Python的单词的句子数[关闭]

C语言表达式怎么计算?

如何在mysql pdo中计算句子中的单词

如何处理批次内不同实例中的不确定句子数量?