C ++中字符串中的偶数和奇数索引字符

时间:2016-10-02 18:41:40

标签: c++ string oop

给定长度为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;
}

2 个答案:

答案 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()而不是上面提到的任何其他功能。