无法计算输出中的额外行

时间:2017-07-08 21:12:23

标签: c++ string

以下代码的I / O有问题。刚进入t后,我得到一条输出线,我无法解释,我是初学者,这太令人沮丧了。请看看。

#include<bits/stdc++.h>

using namespace std;

int main()
{
    string name;
    string sname;
    int t;
    cin>>t;
while(t--)
{

    getline(cin,name);
    *(name.begin())-=32;
    if(name.find(" ")==-1)
    {
        cout<<name;
    }

    *(name.begin()+name.find(" "))=49;
    if(name.find(" ")==-1)
    {
            *(name.begin()+name.find("1")+1)-=32;
            sname=name.substr(name.find("1")+1);
            cout<<*(name.begin())<<"."<<" "<<sname;
    }
    else
    {
        *(name.begin()+name.find("1")+1)-=32;
        *(name.begin()+name.find(" ")+1)-=32;
        sname=name.substr(name.find(" ")+1);
        cout<<*(name.begin())<<"."<<" "<<*(name.begin()+name.find("1")+1)<<"."<<" "<<sname;
    }
    printf("\n");
}
return 0;
}

1 个答案:

答案 0 :(得分:0)

好的,我真的不认为有任何错误,但我会建议你修改一段代码,它会更具可读性,更高效,更不容易出错:

// #include<bits/stdc++.h> I don't know what that include is, use more specific header based on your needs like
#include <string> // for std::string
#include <iostream> // for std::cout

// using namespace std;
// Avoid using "using namespace", it's a really bad practice in C++

int main()
{
  std::string name;
  std::string sname;
  int t;

  std::cin >> t;

  while(t--)
    {
      std::getline(std::cin, name);

      // *(name.begin()) -= 32;
      // Use operator[], it was made for that purpose
      name[0] -= 32;

      size_t pos = name.find(" ");

      if(pos == std::string::npos)
        {
          std::cout << name;
        }

      name[pos] = 49; // pretty dangerous since pos could be std::string::npos, which is the max value for a size_t

      pos = name.find(" ");

      size_t first_one = name.find("1");

      // here you should check if first_one != std::string::npos

      if(pos == std::string::npos)
        {
          name[first_one + 1] -= 32;
          sname = name.substr(name.find("1") + 1); // dangerous
          std::cout << name[0] << ". " << sname;
        }
        else
        {
          name[first_one + 1] -= 32;
          name[pos + 1] -= 32;
          sname = name.substr(name.find(" ")+1); // dangerous too
          std::cout << name[0] << ". " << name[name.find("1")+1] << ". " << sname;
        }
      // printf("\n"); Avoid using printf, std::cout is here for c++ (printf comes from C)
      std::cout << '\n';
    }
  return 0;
}

总而言之,避免“使用命名空间”,这是不好的,用于解释,谷歌,第一个链接等。 使用cppreference.com或cplusplus.com等网站查看std :: string或std :: cout等对象的方法和用法。 避免执行std::cout << "a" << "b";,而是执行std::cout << "ab";,或者如果您需要输出单个字符std::cout << 'a';

验证所有内容,开发人员的一个重要且非常重要的规则是“永远不要相信用户”,总是想象他们会试图打破你的程序,你可能会想“是的,但我会成为唯一的用户”,这是一个坏的理由,早点养成好习惯。所以总是检查一下,如果t为负数,你的程序几乎是无限的,如果没有空格或'1',它会爆炸等等。所有这些小错误都可能是更大软件中的安全漏洞。

祝你好运:)