不知何故,當我運行此代碼並涉及到輸入字符串時,第一個字符串i = 0將被跳過,並開始從A [1]輸入字符串。所以我最終得到了內存中隨機填充的A [0]。有人可以指出這個問題嗎?字符串數組中的第一個字符串正在被跳過
回答
該代碼是可怕的。以下是它在實際C++中的外觀:
#include <string>
#include <iostream>
#include <vector>
int main()
{
std::cout << "Please start entering lines. A blank line or "
<< "EOF (Ctrl-D) will terminate the input.\n";
std::vector<std::string> lines;
for (std::string line; std::getline(std::cin, line) && !line.empty();)
{
lines.push_back(line);
}
std::cout << "Thank you, goodbye.\n";
}
請注意缺少任何指針或new
表達式。
如果您喜歡,您可以在for
循環中的條件檢查開始處添加std::cout << "> " &&
以添加一點提示。
那麼,你可能會得到一個空字符串:當閱讀s
時,你使用格式化輸入,一遇到非數字就停止,例如用於指示輸入的換行已完成。因此,立即找到換行符,終止讀取的第一個字符串。
這就是說,你應該從來沒有使用gets()
:這是一個主要的安全問題和許多潛在的攻擊的根本原因!相反,您應該使用fgets()
或更好的std::getline()
以及std::string
s和std::vector<std::string> >
。 ASLO,你應該總是驗證嘗試輸入是成功的:
if ((std::cin >> s).ignore(std::numeric_limits<std::streamsize>::max(), `\n`)) {
std::string line;
for (int i(0); i != s && std::getline(std::cin, line);) {
A.push_back(line);
}
}
的問題是,cin>>s;
只是拿起你想要的號碼,(從enter
按換行)離開\n
上stdin
是gets()
在第一次迭代中提到。這不是修復它,但要證明這一點寫這行線後的最好方式:
int a = fgetc(stdin);
退房a
事後確認它有一個換行符。
任何方式我可以清除標準輸入\ n? – lwiii
我指定的方式工作正常,並且是最小的變化;但更優雅的方式會像Kerrek SB建議的那樣使用'std :: getline'。 – imreal
您也可以倒退()stdin來清除輸入緩衝區。 – HerrJoebob
- 1. 循環跳過數組中的第一個字符串
- 2. 功能被跳過一個字符串
- 3. C程序跳過字符串中的第一個字符
- 4. 從字符串數組中獲取第一個字符串c
- 5. printf跳過字符數組的第一個字符
- 6. 在字符串中找到一個數組中的字符串
- 7. 跳到下一個非空白字符的字符串數組
- 8. 查找數組字符串中的第一個字符
- 9. 數組中的PHP字符串只返回第一個字符
- 10. 如何計算字符串數組中字符串的第一個字母C#
- 11. 選擇第一5個字符,在C#字符串數組
- 12. AsyncPlayerChatEvent,嘗試查看字符串數組中的字符串是否包含在來自第二個字符串數組的另一個字符串中
- 13. 在字符串中查找字符串的第一個實例
- 14. 使用正則表達式跳過字符之間的第二個字符串
- 15. 字符串數組中的字符串
- 16. 獲取字符串中子字符串的第一個字母
- 17. 剝字符串的第一個字符
- 18. 數組字符串不被識別爲數組字符串
- 19. 如何通過第一個字符串將字符串對的向量分組?
- 20. 比較與另一個字符串數組中的字符串
- 21. C++中的字符串創建一個字符串數組
- 22. 如何通過每個字符串的第二個字符串來排序字符串數組?
- 23. 一個字符串數組
- 24. 字符串向量的next_permutation正在跳過一個排列
- 25. str.find()似乎被忽略的第一個字符的字符串
- 26. 字符串直到Java中的第一個數字字符
- 27. 正則表達式 - 第一個整數的字符串(跳過浮動)
- 28. 子字符串在第一個字母數字字符
- 29. F#:檢查一個值是否是一個字符串數組,字符串數組或字符串數組
- 30. 跳過第2列有一個字符串的行
讓我們看看在收集這些字符串後打印這些字符串的代碼。 – mah