【问题标题】:C++ : Checking the contents of a stringC++:检查字符串的内容
【发布时间】:2014-12-09 14:36:57
【问题描述】:

抱歉,我使用的是古代编译器

#include <iostream.h>
#include <conio.h>
#include <ctype.h>
void main()
{
   char s[6] = "mOh1t*";
   int u = 0 , l=0 , d=0 , sp=0 , t = 0;
   for (int x = 0 ; s[x] ; x++)
   {
      if (isupper(s[x]))
        u++;
      else if(islower(s[x]))
        l++;
      else if (isdigit(s[x]))
        d++;
      t++;
   }
   sp = t - (u+l+d);
   cout<<"t:"<<t;
   cout<<"u:"<<u;
   cout<<"l:"<<l;
   cout<<"d:"<<d;
   cout<<"sp:"<<sp;
   getch();
}

上面的代码清楚地统计了一个字符串中的字母(大小写)个数、数字个数和特殊字符个数。

我想知道是否可以不使用 使用 if 语句/三元运算符/switch case。 如果是的话,我可以得到线索吗?

感谢 HoosierEE 的回答

更新:是否可以在不使用内置函数的情况下与 hoosierEE 的答案相同?

- 想要学习的 C++ 新手

【问题讨论】:

  • 使用 'switch' 或 '?:',但为什么?
  • 如果您真的想学习,请获取更新的编译器并学习现代标准。
  • @crashmstr 哈哈 :) 我想我应该升级了!
  • @Mohit_Bhasi 如果您使用的是 Turbo C++ 之类的东西,C++ 语言已经发生了显着变化(请注意,我在 20 多年前使用的是 Turbo C++)。
  • @crashmstr 是的,我现在正在使用它,肯定会升级。感谢您的建议:)

标签: c++ logic


【解决方案1】:

如果你只是想避免 if 语句,你可以将布尔值视为 0 和 1 并像这样总结字符:

for (int x = 0; s[x]; x++)
{
    u += isupper(s[x]);
    l += islower(s[x]);
    d += isdigit(s[x]);
    t++;
}

...但是正如@Angew 所提到的,您不能依赖这些函数的结果只是 0 或 1。

为了回答 UPDATE,以下是在不使用 stdlib 函数的情况下实现所需目标的方法:

for (int x = 0; s[x]; x++)
{
    u += ((s[x] >= 'A') && (s[x] <= 'Z'));
    l += ((s[x] >= 'a') && (s[x] <= 'z'));
    d += ((s[x] >= '0') && (s[x] <= '9'));
    t++;
}

您可以查找ASCII values 并在其中输入数字,但我认为使用字符文字更具可读性。个人喜好。

您也可以考虑对终止条件更严格一些:

for (int x = 0; s[x] != '\0'; x++)

【讨论】:

  • 是的,C 和 C++(以及 others)说 true == 1false == 0
  • 更像0false0 以外的任何东西都是true
  • 然而,isupper、islower 和 isdigit 函数返回一个 int,其中非零表示真,0 表示假。
  • 除非您将结果转换为 bool 首先 - std::isupper 并且朋友返回任意非零数字作为真值,否则这将失败。
  • @hoosierEE s[x]!='\0' 和 s[x] 有什么区别?一直以为他们的意思是一样的
猜你喜欢
  • 2017-10-22
  • 1970-01-01
  • 1970-01-01
  • 2010-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-17
相关资源
最近更新 更多