gpt4 book ai didi

c++ - 无法使 ispunct 或 isspace 工作,但 isupper 工作正常。你能帮助我吗?

转载 作者:行者123 更新时间:2023-11-28 00:16:33 24 4
gpt4 key购买 nike

这段代码只输出大写字母的个数。它总是将 numMarks 和 numSpaces 输出为 0。我也尝试过 sentence.c_str() 得到相同的结果。我无法理解发生了什么。

cout << "Please enter a sentence using grammatically correct formatting." << endl;
string sentence = GetLine();
int numSpaces = 0;
int numMarks = 0;
int numCaps = 0;
char words[sentence.length()];
for(int i = 0; i < sentence.length(); ++i)
{
words[i] = sentence[i];
if(isspace(words[i]) == true)
{
numSpaces++;
}
else if(ispunct(words[i]) == true)
{
numMarks++;
}
else if(isupper(words[i]) == true)
{
numCaps++;
}
}
cout << "\nNumber of spaces: " << numSpaces;
cout << "\nNumber of punctuation marks: " << numMarks;
cout << "\nNumber of capital letters: " << numCaps;

编辑:修复了问题。我的编译器很奇怪。我所要做的就是删除 == true 它工作得很好。感谢您提供的信息。现在我知道 future

最佳答案

您正在使用的函数 isspaceispunctisupper 的返回类型为 int。如果不匹配则返回 0,如果匹配则返回 非零。它们不一定返回 1,因此即使检查成功,测试 == true 也可能失败。

将您的代码更改为:

if ( isspace(words[i]) )   // no == true

它应该开始正常工作(只要您不输入任何扩展字符 - 见下文)。


更多信息:C++ 中有两个不同的 isupper 函数(其他两个函数也一样)。它们是:

#include <cctype>
int isupper(int ch)

#include <locale>
template< class charT >
bool isupper( charT ch, const locale& loc );

您当前使用的是第一个,它是来自 C 的遗留函数。但是您通过传递 char 错误地使用了它;参数必须在 unsigned char 范围内。 Related question .

因此,要正确修复您的代码,请选择以下两个选项之一(包括正确的标题):

 if ( isupper( static_cast<unsigned char>(words[i]) ) )

if ( isupper( words[i], locale() ) )

其他:char words[sentence.length()]; 在标准 C++ 中是非法的;数组维度必须在编译时已知。您的编译器正在实现扩展。

但是这是多余的,您可以只写 sentence[i] 而根本不使用 words

关于c++ - 无法使 ispunct 或 isspace 工作,但 isupper 工作正常。你能帮助我吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29933077/

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