[英]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.