今日は、C ++の見直しの時に自分自身の存在のいくつかの問題を発見し、ここに記録しました。
私たちは、次のコードを見ることができます:
#include <iostream>
#include <cstdio>
#include <string>
#include <cctype>
using namespace std;
int main(int argc, char const *argv[])
{
string s;
cin >> s;
int cnt[26]={0};//字母统计次数
for(int i = 0; i < s.length(); i++){
char c = s[i];
if(isalpha(c)){
cnt[toupper(c) - 'A'] ++;
}
}
for(int i = 0; i < 26; i++){
if(cnt[i] != 0){
cout << char(i + 'A') << ": " << cnt[i] <<endl;
}
}
return 0;
}
私たちは、文字列を入力するとHello World!
、結果は可能でしょうか?
apple@localhost ~/Desktop/cpp_code g++ run.cpp -o run.out -std=c++11 -O2
apple@localhost ~/Desktop/cpp_code ./run.out
Hello World!
E: 1
H: 1
L: 2
O: 1
上記のコードは、発生の頻度で各文字列のための良好な統計はない、と私はスペースの顔に標準入力文字列をCIN、一度だけオフを無視するように、問題を見つけるために、長い時間のために考えることを試みました彼らはカットオフされ、我々は、特別な治療のためのスペースで文字列を入力する必要があり、利用getlineのは、問題の完璧な解決策になることができます。キャリッジリターンを入力する際のgetline(STD :: CIN、のstd ::文字列)が遮断される、いくつかの調整が問題に完璧な解決策になることができ作るために上記のコードを入力してください。
PS:このメソッドは、文字列クラスのです
#include <iostream>
#include <cstdio>
#include <string>
#include <cctype>
using namespace std;
int main(int argc, char const *argv[])
{
string s;
getline(cin, s);
int cnt[26]={0};//字母统计次数
for(int i = 0; i < s.length(); i++){
char c = s[i];
if(isalpha(c)){
cnt[toupper(c) - 'A'] ++;
}
}
for(int i = 0; i < 26; i++){
if(cnt[i] != 0){
cout << char(i + 'A') << ": " << cnt[i] <<endl;
}
}
return 0;
}
我々は再び文字列を入力するとHello World!
、結果は可能でしょうか?
apple@localhost ~/Desktop/cpp_code g++ run.cpp -o run.out -std=c++11 -O2
apple@localhost ~/Desktop/cpp_code ./run.out
Hello World!
D: 1
E: 1
H: 1
L: 3
O: 2
R: 1
W: 1
これは非常にOKです!
また、その中にスペースを含む文字列を入力する他の方法はありませんか?
答えはイエス、私はそれらをリストアップ発生する可能性がある次のような状況のすべてを持っています。
文字列の入力配列は公知である:シーンを
このような場合のために、私たちは直接、時間定義された順序で入力文字列は、我々がしたい知っている、例えば、文字列入力することができHello World!
、我々は次の定義を記述することができます。
str = "Hello World!";
シナリオ2:未知の配列の入力文字列が、文字列の最大長シーケンスを知ります
この方法の一つ:
メソッドを呼び出すことによって、我々はできる与えられた上記に従ってgetlineの機能:
cin.getline(str, len);
入力行を記憶する第1のパラメータのSTR配列名、2番目のパラメータは、読み取るべき文字の数です。
方法2:
私たちは、この問題を解決するために、次のように私たちは自然にgetメソッド呼び出しを考える。この時間を文字の配列を使用することができます。
cin.get(str, len);
そして、改行まで、1行を読んでいるどちらも、同じ方法、および2つのラインの間の差は、getlineの破棄フィードこととGET()入力シーケンスの改行文字に保持されますので、我々は次のように書き換え可能を検討します方法:
while((c=cin.get())!='\n')
そして方法でC言語のライブラリを使用している場合、我々はそれを表現する方法をすべきですか?
方法3:
C言語の文字列を入力し、私たちの最初に考えたのはscanf関数を使用することですが、scanfの改行とスペースを入力し、終了記号異なるグループ間のデフォルトの間隔なので、スペース、タブ、またはキャリッジリターンと入力文字列ではありませんはい、私たちは「%[]。」書式指定子を使用することができます その役割はによって呼び出された文字のセットを、スキャンすることです。
scanf("%[^c]", str);
ここで、「c」は(制御文字を含む)一定の特定の文字です。入力文字列、文字「c」は、現在のターミネータとして入力された場合。このフォーマットでは、プログラマ自身のターミネータで文字入力を指定することができます。
方法4:
使用された関数を取得する方法で、もう一つのC言語入力文字列。ターミネータは、キャリッジリターンであるとして関数が取得する、次のように呼び出します。
char str[length];
gets(str);
前記配列の長さは、文字列の最大長さが特定の値です。
シナリオ3:未知の配列の入力文字列、最大長シーケンスのストリングも知られています
この文字列クラスの問題に対応して、この時間は、我々は次のように呼び出しを解決するためにgetline関数を使用しています:
getline(cin, s);