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

Even and odd indexed characters in a string in C++

本文关键字:字符 索引 字符串 c++      更新时间:2023-10-16

给定一个长度为N的字符串S,其索引从0到N-1,将其偶数索引和奇数索引的字符作为两个空格分隔的字符串打印在一行上。0将被视为偶数索引。输入字符串的个数为T,取值范围为1 ~ 10。该程序在代码块(离线)中给出正确的结果,但不在HackerRank平台上。它给出了错误:

解决方案。cc:在函数'int main()':

解决方案。Cc:22:9:警告:'char* gets(char*)'已弃用(已声明)at/usr/include/stdio.h:638) [-Wdeprecated-declarations](g[我]。s);^

解决方案。Cc:22:20: warning: 'char* gets(char*)'已弃用(声明在/usr/include/stdio.h:638) [-Wdeprecated-declarations](g[我]。s);^

/ccQXNkYE。0:在函数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;
}

函数gets()是危险的,是平台不允许的。warning: the gets' function is dangerous and should not be used.平台甚至告诉你

为什么函数是危险的?简单。它可能导致缓冲区溢出。您将char[]定义为包含终止符在内的1000个字符。gets函数不知道这个。它会很高兴地将用户输入的任何内容复制到数组中,即使它不适合。数组后面的任何内容都将被多余的文本覆盖。这可能会覆盖其他变量,甚至包含可能被执行的恶意代码。最好的情况是程序崩溃。

fgets()比较好。fgets()还要求它应该复制的字符数量。在你的例子中,它应该是999,因为你不想"推翻"终结者。1000年。字符将作为你的终止符。

但是这是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);
}

有些平台不允许gets(),因为它很危险。请使用

scanf(" %[^n]s",string_name);

输入包含空格或fgets()或cin.getline()的字符串。

编辑:

正如我的同事所说,更好的版本是使用cin.getline()而不是上面提到的任何其他函数