以下代码的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;
}
答案 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',它会爆炸等等。所有这些小错误都可能是更大软件中的安全漏洞。
祝你好运:)