如何使用“。”,“?”,“!”计算C中的句子数?
Posted
技术标签:
【中文标题】如何使用“。”,“?”,“!”计算C中的句子数?【英文标题】:How do I count the number of sentences in C using ".", "?", "!"? 【发布时间】:2020-10-16 06:41:52 【问题描述】:我对编码还很陌生。我的“CountSentences”功能有问题。我将字符串与“。”进行比较,“?” , 和 !数一个句子。无论字符串中有多少标点符号,它只会在句子计数器中添加一个。我是否错误地使用 strcmp 来获得我想要的结果,还有其他方法可以解决这个问题吗?
#include【问题讨论】:
您的代码将输入的所有 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 个 literals:string 和 compound,但没有 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)