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++)。
,是一个更好的解决方案。@JoachimPileborg
ispunt
将包含括号之类的字符,因此我不确定这是计算句子的最佳解决方案。用这种方法可以避免什么问题?你能提供一个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]
时,代码会显示未定义的行为。