gpt4 book ai didi

c++ - 使用strchr的作业问题给了我意外的输出

转载 作者:行者123 更新时间:2023-12-02 09:54:46 26 4
gpt4 key购买 nike

我必须编写一个C程序,该程序输出文本中的单词数量,并在下一行中以元音或辅音开头和结尾的单词。

例如:

input
La bacalaureat la proba de Informatica a fost un subiect cu un sir de caractere
output
15
bacalaureat Informatica a fost subiect sir

这是我的程序:
#include <iostream>
#include <string.h>

using namespace std;

int main()
{
int c = 0;
char sir[100], copie[100];
cin.get(sir, 100);
strcpy(copie, sir);
char* pch = strtok(sir, " ");
while (pch != NULL)
{
c++;
pch = strtok(NULL, " ");
}
cout << c << endl;
char* pch2 = strtok(copie, " ");
while (pch2 != NULL)
{
if ((strchr("aeiouAEIOU", pch2[0]) && strchr("aeiouAEIOU", pch2[strlen(pch2)-1])) || (strchr("aeiouAEIOU", pch2[0] == NULL) && strchr("aeiouAEIOU", pch2[strlen(pch2)-1] == NULL)))
{
cout << pch2<<" ";
}
pch2 = strtok(NULL, " ");
}
}

但这给了我意外的输出。我得到:
15
La bacalaureat la proba de Informatica a fost un subiect cu un sir de caractere

我不明白为什么。显然是因为这样,但是对我来说还可以。

您能帮我修复程序吗?我不明白这是怎么回事。谢谢。

最佳答案

该子表达式在if语句中使用

strchr("aeiouAEIOU", pch2[0] == NULL) && strchr("aeiouAEIOU", pch2[strlen(pch2)-1] == NULL)

是错的。

必须有
strchr("aeiouAEIOU", pch2[0]  ) == NULL && strchr("aeiouAEIOU", pch2[strlen(pch2)-1] ) == NULL

您可以通过以下方式更简单地编写if语句
if ( ( strchr( "aeiouAEIOU", pch2[0] ) == NULL ) == 
( strchr( "aeiouAEIOU", pch2[strlen(pch2)-1] ) == NULL ) )

但是无论如何,创建源字符串的副本并使用 strtok并不是一个好方法。

最好使用标准C函数 strspnstrcspn在不更改字符串的情况下提取字符串中的单词。

您可以将满足条件的单词存储在 vector 中。

这是一个演示程序。
#include <iostream>
#include <utility>
#include <vector>
#include <cstring>
#include <cctype>

int main()
{
const char *s = "La bacalaureat la proba de Informatica "
"a fost un subiect cu un sir de caractere";

const char *vowels = "aeiou";
const char *delim = " \t";

std::vector<std::pair<const char *, const char *>> v;
size_t n = 0;

for ( const char *p = s; *p != '\0'; )
{
p += std::strspn( p, delim );
const char *q = p;

if ( *q )
{
++n;
p += std::strcspn( p, delim );

char c1 = std::tolower( ( unsigned char )q[0] );
char c2 = std::tolower( ( unsigned char )p[-1] );

if ( ( std::strchr( vowels, c1 ) == nullptr ) ==
( std::strchr( vowels, c2 ) == NULL ) )
v.emplace_back( q, p );
}
}

std::cout << n << '\n';
for ( const auto &p : v ) std::cout.write( p.first, p.second - p.first ) << ' ';
std::cout << '\n';

return 0;
}

它的输出是
15
bacalaureat Informatica a fost subiect sir

关于c++ - 使用strchr的作业问题给了我意外的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61159816/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com