簡體   English   中英

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

[英]Even and odd indexed characters in a string in C++

給定一個長度為 N 的字符串 S,索引從 0 到 N-1,將其偶數索引和奇數索引字符作為 2 個空格分隔的字符串打印在一行上。 0 將被視為偶數索引。 輸入字符串的數量可以是從 1 到 10 的 T。該程序在代碼塊(離線)中給出了正確的結果,但在 HackerRank 平台上卻沒有。 它給出了錯誤:

solution.cc:在函數“int main()”中:

solution.cc:22:9: 警告: 'char* gets(char*)' 已棄用(在 /usr/include/stdio.h:638 處聲明)[-Wdeprecated-declarations] gets(g[i].s) ; ^

solution.cc:22:20: 警告: 'char* gets(char*)' 已棄用(在 /usr/include/stdio.h:638 處聲明)[-Wdeprecated-declarations] gets(g[i].s) ; ^

/ccQXNkYE.o: 在函數main': solution.cc:(.text.startup+0x4e): warning: the gets 函數是危險的,不應使用。

我的代碼是:

#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 個字符。 get 函數不知道這一點。 它會很高興地復制用戶輸入到數組中的任何內容,即使它不適合。 數組后面的任何內容都將被多余的文本覆蓋。 這可以覆蓋其他變量,甚至包括可以執行的惡意代碼。 最好的情況是你的程序崩潰。

最好使用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);
}

有些平台不允許gets() 是危險的。 而是使用

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

在這種情況下輸入一個包含空格或 fgets() 或 cin.getline() 的字符串。

編輯 :

正如我的同伴所說,更好的版本是使用 cin.getline() 而不是上述任何其他函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM