/*
找第一個只出現一次的字符。
一串只包含小寫字母且長度小于100000的字串,請編程找出第一個只出現一次的字符。如果找到則輸出這個字符。如果沒有只出現一次的字符,輸出no
*/
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str;
int strNum[26] = { 0 };
char strOrder[26] = { 0 };
cin >> str;
int nIndex = 0;
for (int i = 0; str[i] != '\0'; i++)
{
strNum[str[i] - 'a']++;
if (1 == strNum[str[i] - 'a'])
{
strOrder[nIndex] = str[i];
nIndex++;
}
}
for (int i = 0; i < 26; i++)
{
if (1 == strNum[strOrder[i] - 'a'])
{
cout << strOrder[i] << endl;
return 0;
}
}
cout << "no" << endl;
return 0;
}
代碼運行結果正確,出現一個警告。
if (1 == strNum[strOrder[i] - 'a'])
Warning C6385 Reading invalid data from 'strNum': the readable size is '104' bytes, but '-388' bytes may be read.
分析后發現確實有邏輯錯誤,aabbcc這樣的字串出現的時候。strOrder的[4,26]位值為0,下標為-'a'。
修正為
if ('a' <= strOrder[i] && strOrder[i] <= 'z' && 1 == strNum[strOrder[i] - 'a'])但是疑惑的是
strNum[str[i] - 'a']++;
這句代碼應該也有這樣的問題,甚至更為嚴重危險。因為if里面我只取值,這句代碼直接操作了記憶體空間。但是對于這句卻沒有任何警告?
小朋友疑惑?
uj5u.com熱心網友回復:
gcc編譯沒有任何警告。我覺得單純是編譯器要檢測這種警告比較困難,畢竟c++主要考慮的是性能、兼容c。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/87318.html
標籤:C++ 語言
上一篇:關于C的幾個問題
下一篇:c++函式練習
