我想计算字符串中的大写字符数。为什么我的代码输出错误? 我正在做一个编程练习,“用C++”。本练习的目标是计算给定字符串中大写字母的数量(本练习称之为“驼峰大小写”)

我想计算字符串中的大写字符数。为什么我的代码输出错误? 我正在做一个编程练习,“用C++”。本练习的目标是计算给定字符串中大写字母的数量(本练习称之为“驼峰大小写”),c++,string,stl,C++,String,Stl,因此,考虑到以下两个输入: 克杰库伊 香港电讯 我希望分别获得以下计数: 五, 四, 然而,根据我在下面包含的代码,我得到的是: 0 五, 这显然是不正确的,但我在代码中很难隔离这个问题。我如何推理这个问题,或调试我的错误 #包括 #包括 使用名称空间std; int main(){ int t;cin>>t; 而(t--) { int res=0; 字符串str; getline(cin,str); int len=str.length(); 对于(int i=0;i,在输入整数值

因此,考虑到以下两个输入:

  • 克杰库伊
  • 香港电讯
我希望分别获得以下计数:

  • 五,
  • 四,
然而,根据我在下面包含的代码,我得到的是:

  • 0
  • 五,
这显然是不正确的,但我在代码中很难隔离这个问题。我如何推理这个问题,或调试我的错误

#包括
#包括
使用名称空间std;
int main(){
int t;cin>>t;
而(t--)
{
int res=0;
字符串str;
getline(cin,str);
int len=str.length();

对于(int i=0;i,在输入整数值为
t
后,在输入缓冲区中留下换行符。因此,第一次调用
getline
会得到空字符串。您必须执行以下操作:

int t;
cin >> t;
cin.ignore();
while (t--) {
  ...
}

若要使用换行符,则getline的两个调用都将正确返回输入的字符串。

主要问题是,您正在尝试将第15行中的字符转换为整数。整数不能是大写或小写。因此它给出了错误的答案。只需检查isupper(s[i]),因为它将给出正确的答案

以我的代码为例

#include <bits/stdc++.h>

using namespace std ;
int main() {
    int t ; cin >> t ;
    while(t--) {
        string s ; cin >> s ;
        int cnt = 0 , ln = s.size() ;
        for(int i = 0 ; i < ln ; i ++) {
            if(isupper(s[i])) cnt ++ ;
        }
        cout << cnt << endl ;
    }

    return 0;
}


#包括
使用名称空间std;
int main(){
int t;cin>>t;
而(t--){
字符串s;cin>>s;
int cnt=0,ln=s.size();
对于(int i=0;i首先,值得注意的是,这个练习题叫“骆驼字母表”实际上是大写字母。我已经更新了你的问题来反映这一点。CAMEL案例是一个复合标识符的约定,如<代码> CAMELCASE < /代码>(由于上例“C”,请注意中间的“驼峰”)。。我还将您的示例字符串、预期输出和实际输出移到顶部,并对您的问题进行了扩展,希望有助于改进您得到的响应类型。请注意,您的代码中存在一个主要错误。
isupper()
应该使用一个字符,强制转换为
无符号字符
。这里的基本原理是,由于C语言的传统,
isupper
应该在有效字符或EOF上工作,EOF为负值。因此字符的有效输入范围是0..255,即使您的平台碰巧将
字符定义为有符号字符(-128..127在二的补码上)。然后,您的代码将为非ASCII-7输入给出错误的结果,如“Ö”或“Д(应注册为大写,但不会,因为它们是负数,因此被解释为EOF)…是的,
int
,而不是
char
。请看我上面的评论;您的代码与OP的代码有相同的错误。很抱歉,我可以质疑您它没有错误。我已经在在线评委(Geeksforgeks)上测试过了它被接受了。没有正确的逻辑,不要坏评论。我已经把正确的逻辑联系起来了。但是,好吧,你似乎是更实际的类型。考虑,<代码> '/Code > /拉丁文小字母Y与diaEXCESS(不是对着你大喊大叫,只给出字母的正确的Unicode名称)。。在拉丁语1/Latin-9中,这是
'\xff'
。请自己尝试:
islower('\xff')
为false,
islower(-1)
为false,
islower((unsigned char)\xff')
为true。(我在这里使用十六进制转义,因为源代码的处理是由实现定义的)。请解释为什么只有带强制转换的版本才能产生正确的结果。此外。