在c ++中逐个打印字符,数字和特殊字符

时间:2017-01-15 07:13:01

标签: c++

我想逐个打印字符,数字和特殊字符,但是在接受字符串时出错。

#include<iostream.h>
#include<string.h>

main()
{
   string s = "124#$&afhj";
   int i;
   for(i=0;i<s.length();i++)
   {
      if((s[i]>=65&&91>=s[i])||(s[i]>=95&&123>=s[i]))
      {
         cout<<s[i]<<endl;
      }
      else
      {
        if(s[i]>=0&&s[i]<=9)
        {
            cout<<s[i]<<endl;
        }
        else
        {
            cout<<s[i];
        }
      }
   }
}

2 个答案:

答案 0 :(得分:2)

  • 您使用的是非标准标头<iostream.h>。它必须是<iostream>。你不是在使用20世纪90年代的古代编译器,不是吗?有适用于Windows和Linux的优秀的免费和现代C ++编译器。下载一个并使用它。
  • <string.h>存在,但不是获取std::string的正确标头;它反而包含C风格的char*函数,而不是你想要的。
  • main必须返回int,即使不需要return 0声明。
  • 如果没有string前缀,则无法使用coutendlstd::。因此,请std::stringstd::coutstd::endlDo not use using namespace std
  • Do not use std::endl but '\n'.
  • C ++不保证ASCII,它甚至不保证字母是连续的(它确保数字,见下文)。虽然您不太可能遇到与ASCII不兼容的系统,但您仍应养成编写安全,可移植代码的习惯。这意味着您不应该使用像65这样的幻数,而是使用'A'。当然,您的>=比较不能保证有效。在C ++中,实现这一点非常困难。您可以使用std::isalpha但必须注意不要调用未定义的行为。另请参阅more detailed treatise on this subject
  • 91是']'的ASCII。你的'Z'肯定意味着90。 95和123同样是关闭的。看看http://www.asciitable.com/。但是,请参阅上文,不要使用幻数,也不要使用>=比较。
  • 您的代码可以使用更多空格来使其更具可读性。
  • 为什么在循环之外声明i?它不必要地增加了它的范围。它的类型错误;当它应该是无符号的,或者只是std::string::size_type时,它是一个有符号的int。但是,您应该考虑使用基于范围的for循环来遍历字符串。
  • 测试0和9的字符没有意义。您想要测试'0''9'。请注意,在这种情况下,即使不保证ASCII,C ++也能保证字符的连续值。因此,您可以安全地使用范围比较。

我们走了:

#include <iostream>
#include <string>
#include <cctype>

int main()
{
   std::string s = "124#$&afhj";
   for (auto&& character : s)
   {
      if (std::isalpha(static_cast<unsigned char>(character)))
      {
         std::cout << character << '\n';
      }
      else
      {
        if (character >= '0' && character <= '9')
        {
            std::cout << character << '\n';
        }
        else
        {
            std::cout << character;
        }
      }
   }
}

这会奏效。我不认为它真的有用,因为它的作用是:

  • 打印带有换行符的数字和字母。
  • 在没有换行符的情况下打印其他所有内容。

但毕竟,这就是原计划的目的。

答案 1 :(得分:-1)

在你的代码中有很多错误。在我看来,您的代码应如下所示:

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

int main() {
    string s = "124#$&afhj";
    unsigned int i;
    for (i = 0; i < s.length(); i++) {
        if ((s[i] >= 65 && 91 >= s[i]) || (s[i] >= 95 && 123 >= s[i])) {
            cout << s[i] << endl;
        } else {
            if (s[i] >= 0 && s[i] <= 9) {
                cout << s[i] << endl;
            } else {
                cout << s[i];
            }
        }
    }
}