给定长度为N且从0到N-1索引的字符串S,将其偶数索引和奇数索引字符作为2个空格分隔的字符串打印在一行上。 0将被视为偶数索引。输入字符串的数量可以是1到10之间的T。程序在代码块(离线)中给出正确的结果,但在HackerRank平台上没有。 它给出了错误:
solution.cc:在函数'int main()'中:
solution.cc:22:9:警告:'char * gets(char *)'已弃用(已声明 at /usr/include/stdio.h:638)[-Wdeprecated-declarations] 得到(G [I] .S); ^
solution.cc:22:20:警告:'char * gets(char *)'已弃用 (在/usr/include/stdio.h:638声明)[-Wdeprecated-declarations] 得到(G [I] .S); ^
/ccQXNkYE.o:在函数
main': solution.cc:(.text.startup+0x4e): warning: the
获取'函数是危险的,不应该使用。
我的代码是:
#include <cstdio>
#include <iostream>
struct str {
char s[10000];
};
int main() {
using namespace std;
int T;
cin >> T;
fflush(stdin);
str g[10];
for(int i = 0; i < T; ++i) {
gets(g[i].s);
fflush(stdin);
}
for(int t = 0; t < T; ++t) {
int j = 0;
while(j < strlen(g[t].s)) {
if(j % 2 == 0)
cout << g[t].s[j];
++j;
}
cout << " ";
int k = 0;
while(k < strlen(g[t].s)) {
if(k % 2 == 1)
cout << g[t].s[k];
++k;
}
cout << endl;
}
return 0;
}
答案 0 :(得分:0)
函数gets()很危险,平台不允许。 warning: the gets' function is dangerous and should not be used.
平台甚至会告诉你。
为什么这个功能很危险?简单。它可以导致缓冲区溢出。 您将char []定义为包含终结符的1000个字符。 gets函数不知道。它会愉快地复制用户输入数组的任何内容,即使它不适合。数组后面的任何内容都将被多余的文本覆盖。这可以覆盖其他变量,甚至包括可以执行的恶意代码。最好的情况是你的程序崩溃。
最好使用fgets()
。 fgets()
还要求它应该复制的字符数量。在你的情况下,它应该是999,因为你不想“覆盖”终结器。 1000. char将成为你的终结者。
然而,这是C方法,而不是C ++。
如果有人输入的数字大于10,会发生什么? 你的程序会崩溃。
以下代码将完全避免使用char [],并允许您使用C ++的std::string
。
#include <iostream>
#include <vector>
#include <string>
int main()
{
std::vector<std::string> inputs;
int strings; // Your T
std::cin >> strings;
if (strings < 1 || strings > 10) {
std::cout << "Error" << std::endl;
exit(1);
}
for (int i = 0; i < strings; i++) {
std::string temp;
std::cin >> temp;
inputs.push_back(temp);
}
// Do your reverse stuff.
exit(0);
}
答案 1 :(得分:-2)
有些平台不允许将gets()作为危险品。 改为使用
scanf(" %[^n]s",string_name);
为该案例输入包含空格或fgets()或cin.getline()的字符串。
编辑:
正如我的同伴所说,更好的版本是使用cin.getline()而不是上面提到的任何其他功能。