【问题标题】:I want to count the upper-case characters in a string. Why is my code is giving wrong output?我想计算字符串中的大写字符。为什么我的代码给出错误的输出?
【发布时间】: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 )。

标签: c++ string stl


【解决方案1】:

在输入整数值t 后,输入缓冲区中会留下换行符。因此,第一次调用 getline 会为您提供空字符串。你必须这样做:

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

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

【讨论】:

    【解决方案2】:

    主要问题是您在第 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;
    }
    
    
    

    【讨论】:

    • isupper( int c )。是的,int,不是char。见我上面的评论;您的代码与 OP 有相同的错误。
    • 很抱歉,我可以挑战你它没有错误。我已经在在线评委(GeeksForGeeks)上测试过它并被接受。没有适当的逻辑,不要发表不好的评论。
    • 我已经链接了正确的逻辑......但是好吧,你似乎更实际的类型。考虑一下,'ÿ' / 带有分音符号的拉丁小写字母 Y(不是对你大喊大叫,只是给出字母的正确 Unicode 名称)。在 Latin-1 / Latin-9 中,这是 '\xff'。自己试试这个:islower( '\xff' ) 是假的,islower( -1 ) 是假的,islower( (unsigned char)'\xff' ) 是真的。 (我在这里使用十六进制转义,因为源编码的处理是实现定义的)。请解释为什么只有 with 的版本才能产生正确的结果。
    猜你喜欢
    • 2020-08-26
    • 1970-01-01
    • 2023-01-24
    • 2014-03-08
    • 2017-08-27
    • 1970-01-01
    • 1970-01-01
    • 2020-07-09
    • 1970-01-01
    相关资源
    最近更新 更多