C-计算句子
我写了这段代码,但我不能处理“?”和其他类似字符的组合?有人能帮我吗?我需要把句子排成一行C-计算句子,c,C,我写了这段代码,但我不能处理“?”和其他类似字符的组合?有人能帮我吗?我需要把句子排成一行 #include<stdlib.h> #include<string.h> #include<stdio.h> int main(){ int say=0,i; char line[250]; gets(line); int k = strlen(line);
#include<stdlib.h>
#include<string.h>
#include<stdio.h>
int main(){
int say=0,i;
char line[250];
gets(line);
int k = strlen(line);
for(i=0; i<k; i++){
if(line[i]=='.' || line[i]=='?' || line[i]=='!'){
say++;
}
}
printf("%d\n",say);
return 0;
}
#包括
#包括
#包括
int main(){
int say=0,i;
字符行[250];
获取(行);
int k=strlen(直线);
对于(i=0;i一种避免问题的方法是使用strtok
:
const char* delim = "?!.";
char *token = strtok(line, delim);
while(token != NULL)
{
say++;
token = strtok(NULL, delim);
}
阅读该行后,您需要放弃多个连续的标点符号序列。您可以使用一个简单的状态标志:
对输入进行迭代(循环)。如果有标点符号,则设置状态(记住在开始时将其初始化为unset)。如果有普通(非标点符号)字符且设置了状态标志,则增加句子计数器并清除标志。否则,不要做任何特殊操作
我将把实现留作练习。尝试添加一些例外情况,您可以检查,?
,!
标点符号之前的字符是否与它们中的任何一个相同。如果是,请不要递增
if(line[i]=='.' || line[i]=='?' || line[i]=='!') {
if (i-1 > -1 && (line[i-1]!='.' && line[i-1]!='?' && line[i-1]!='!'))
say++;
}
i-1>-1
解决了一种特殊情况,即
,?
,!
中的任何一个字符是行的第一个字符,并且包含在句子计数中,不应被忽略
尝试后,“?”
组合将产生0
的结果
结果:
.?!
0
?.!
0
!.?
0
!?.
0
!.?
0
.!?
0
ho hey! hello?
2
. Really?
1
Hello world!
1
不要使用gets
。而是使用fgets(line,sizeof(line),stdin)
代码有什么问题?对于某些指定的输入,实际和预期的输出是什么?您需要定义什么是“句子”如果你考虑每一个问号、感叹号或句点组成一个句子,那么这个程序是正确的。与你可能的问题无关:<代码>(i=0;i <代码>为(i=0;行[i]!=\ 0;i++)。
,是一个更好的解决方案。@JoachimPileborgispunt
将包含括号之类的字符,因此我不确定这是计算句子的最佳解决方案。用这种方法可以避免什么问题?你能提供一个OP的代码失败并且可以工作的例子吗?谢谢,我会检查它。这个问题是从我提交上面的代码y是50%。@szczurcio,根据OP在上面评论中给出的链接,Hello world!
应该输出1。OP的代码输出2,而我的代码输出1。太晚了。我明天可能会添加更多细节。@szczurcio,Oops。我想OP(和我)检查空间。无论如何,此解决方案解决了OP的问题。谢谢,我想我会得到它:)我建议在之前移动I-1>-1
(行[I-1]!='。&&line[I-1]!='?'&&line[I-1]!=')
。否则,如果行
的第一个字符是
或?
或!
,则当您访问行[-1]
时,代码会显示未定义的行为。