【发布时间】:2020-08-21 01:26:20
【问题描述】:
我正在使用 C++ 进行编程练习“Count of camel case characters”。练习的目标是计算给定字符串中大写字母的数量(练习称为“驼峰式”)。
所以给定以下两个输入:
- ckjkUUYII
- HKJT
我会期望分别得到以下计数:
- 5
- 4
但是,根据我在下面包含的代码,我得到的是:
- 0
- 5
这显然是不正确的,但我很难在我的代码中找出问题所在。我该如何解决这个问题,或者调试我的错误?
#include <iostream>
#include <cstring>
using namespace std;
int main() {
int t;cin>>t;
while(t--)
{
int res=0;
string str;
getline(cin,str);
int len= str.length();
for(int i=0;i<len;i++)
{
int c=str[i];
if(isupper(c))
res=res+1;
}
cout<<res<<endl;
}
//return 0;
}
【问题讨论】:
-
欢迎来到 Stack Overflow。首先,值得注意的是,练习题所称的“驼峰式字母”实际上是大写字母。我已经更新了您的问题以反映这一点。 Camel case 是复合标识符的约定,例如
camelCase(请注意中间的“驼峰”,由于大写“C”)。我还将您的示例字符串、预期输出和实际输出移到顶部,并扩展了您的问题,希望有助于改进您获得的响应类型。 -
请注意,您的代码中有一个重大错误。
isupper()应该接受一个字符,转换为unsigned char。这里的基本原理是,由于 C 的传统,isupper应该适用于有效字符 或 EOF,即 否定。因此,字符的有效输入范围是 0..255,即使您的平台碰巧将char定义为 signed(二进制补码为 -128..127)。然后,您的代码将为非 ASCII-7 输入给出错误结果,例如“Ö”或“Д(应该注册为大写,但不会因为它们是负数,因此解释为 EOF )。