【问题标题】:C++ beginner, switch isn't outputting first character of string [closed]C ++初学者,开关不输出字符串的第一个字符[关闭]
【发布时间】:2016-09-09 21:03:02
【问题描述】:

我的任务是从用户那里获取一个没有空格的字符串,并让计算机计算字符、字母、数字和特殊字符的数量(即!@#$%^&*)但是程序似乎是无论该字符属于哪个类别,都跳过第一个字符。请注意,它确实将其计算在字符数中,而不是在其类别中 例子: cin >> aZ12!@

输出:6 个字符,1 个字母,2 个数字,2 个特殊字符。 它总是跳过第一个字符。

#include <iostream>
#include <string> 
using namespace std;

int main()
{
    char str[100]; // available character string max is 99 characters
    int i;
    int lett;
    int num;
    int spec;

    cout << "Please enter a continuous string of characters with no spaces" << endl ;
    cout << "(example: ASO@23iow$)" << endl << endl ;   //shows an example and then adds a blank line
    cout << "Enter your string: " ;
    cin >> str ;
    cout << endl ;

   while(str[i] != 0)
   {
      switch(str[i])
       {
            case '0' ... '9':
                i++ && num++;
                break ;
            case 'a' ... 'z':
                i++ && lett++;
                break ;
            case 'A' ... 'Z':
                i++ && lett++;
                break ;
            default :
                i++ && spec++;
       }
   }

   cout << "your string has " << i << " characters" << endl ;
   //prints the number of numbers in the string
   cout << "Your string has " << num  << " numbers in it." << endl ;       
   cout << "Your string has " << lett << " letters in it." << endl ;
   cout << "Your string has " << spec << " special characters." << endl   ;
   return 0 ;

【问题讨论】:

  • 您的变量未初始化,因此可能包含任何内容。初始化时将 i、lett、num 和 spec 设置为 0。
  • a) '0' ... '9' 不是标准 C++ 并且 b) 您需要启用更多编译器警告。
  • 我没有看到你在任何地方初始化 i 的值?你不应该在使用它之前将它设置为零吗?
  • @Mojo 这与您的格式无关,而是您在研究和调试尝试中没有表现出足够的努力。
  • @Mojo 这不是关于编程的好坏,而是关于如何提出一个好的问题。这个问题归结为,跳过第一个字母,这里是代码。如果我作为某方面的专家来找你,比如机械师,说这部分漏水,然后你把它翻过来,发现底部有洞,你也会生气。为解决问题付出更多的努力,您将成为一名出色的程序员。

标签: c++ string switch-statement


【解决方案1】:

在您的代码中,int i 未初始化。使用它是未定义的行为

int i = 0;

其他变量也是如此。 这也不像你认为的那样:

i++ && lett++;

这不是同时进行操作,它是一个布尔运算符。它采用了一种称为短路的方法,这意味着如果 &amp;&amp; 的第一部分评估为假(即 0),那么表达式必须为 0,因此评估它的其余部分(即 lett++ 部分)毫无意义)。因此,对于您的第一个循环 (i == 0),您的 lett++ 将被短路。

将这些更改为:

i++;
lett++;

如果你解决了这个问题,它会起作用:

Live example

【讨论】:

  • 没有解决问题。它仍然会跳过第一个字符。
  • 再次,没有解决问题。
  • @Mojo 我投了反对票,这个问题不符合本网站的标准。下次,尝试使用调试器解决问题,如果仍然无法解决,请提供 MCVE 并详细说明您尝试解决问题的具体内容。您显然没有查看 &amp;&amp; 做了什么,如果您已经调试并跨过 ilett 的增量,您会立即找到它。再努力一点!
  • @Mojo,当然,但你查了吗?当您在每一行打印出ilett 的值时,您是否对为什么i 递增而lett 不递增感到困惑?这不会让你仔细检查吗?你没有做上述任何事情,因为你的第一个问题就是问,有人会告诉你。那是一个糟糕的开始,这就是为什么我不应该在这里回答:(
  • @Mojo "我什至不知道如何使用 xcodes 调试器" - 现在是学习的最佳时机..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-04
  • 2013-04-12
  • 2021-04-15
相关资源
最近更新 更多