无法获得ispunct或isspace工作,但isupper工作正常。你能帮助我吗?

时间:2015-04-29 02:03:07

标签: c++ char boolean

此代码仅输出大写字母数。它总是将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它完美无缺。谢谢你的信息。现在我知道未来

3 个答案:

答案 0 :(得分:2)

您使用的函数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

答案 1 :(得分:1)

请将您的代码更改为

char c;
...
c = sentence[i];
if(isspace(c))
{
    ++numSpaces;
}
...

isspace如果不是空格或制表符则返回零,但如果它是空格或制表符,则不能假定它总是返回1。它来自http://www.cplusplus.com/reference/cctype/isspace/,&#34; 如果确实c是空白字符,则该值不等于零(即,为真)。否则为零(即假)。&#34;

但如果使用true对其进行测试,则true会转换为1并且测试失败,例如,在我的计算机上,它会返回8一个空格。

答案 2 :(得分:0)

需要考虑两件事。

首先,我会使用&#34;否则if(ispunct(words [i])!= 0)&#34;而不是将函数的返回值与true进行比较。这是因为函数返回一个整数。返回的整数值可能与等于平台或编译器中定义的true的情况不匹配。

我的第二个建议是检查你的语言环境。在unix中,您可以使用&#34; locale&#34;命令。在Windows中,您可以询问谷歌如何检查您的语言环境,例如Windows 7。

https://www.java.com/en/download/help/locale.xml

如果你的语言环境是一个广泛的角色&#34;在locale中,您可能需要使用iswpunct(wint_t wc)而不是ispunct(int c)。

我希望这会有所帮助