2011-12-15 9 views
-2

このプログラムは、人の名前と電話番号を保持する10個の文字列オブジェクトの配列を持つことになっています。配列に検索する名前または部分名を入力するようにユーザーに求め、入力された文字列と一致する配列内のすべての項目を表示する必要があります。コードの実行に問題があります。Cの文字列と初期化された文字列の配列の比較

#include "stdafx.h" 
#include <iostream> 
#include <cstring> 
#include <string> 

using namespace std; 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
    const int size = 50; 
    char name[50]; 
    int count; 

    char list[] = {"Becky Warren, 555-1223", 
        "Joe Looney, 555-0097", 
        "Geri Palmer, 555-8787", 
        "Lynn Presnell, 555-8878", 
        "Holly Gaddis, 555-8878", 
        "Sam Wiggins, 555-0998", 
        "Bob Kain, 555-8712", 
        "Tim Haynes, 555-7676", 
        "Warren Gaddis, 555-9037", 
        "Jean James, 555-4939", 
        "Ron Palmer, 555-2783"}; 


    cout << "Enter a name or partial name: " << endl; 
    cin.getline(name, size); 
    cin.ignore(); 

    for(count = 0; count < 10 ; count++){ 
     if(strstr(list[count], name)){ 
      cout << list[count]; 
     } 
    } 

    cin.get(); 
    return 0; 
} 
+5

あなたはどのような問題を抱えている。同様に、あなたのような何かが、 std::find_ifを使うのでしょうか? –

+1

まず、配列に11個のエントリがあります。第2に、 'strstr'は大文字と小文字を区別するので、' 'Becky''は' 'becky''と等しくありません。 –

+0

C++プログラムでC文字列を使用しているのはなぜですか? –

答えて

0

私のコンパイラに合ったマイナーな変更が行われました。このコードは機能します。 2次元char listの訂正宣言。 は、ハードコードされた入力と、ここで実行している:http://codepad.org/ZVkbLjHU

#include <iostream> 
    #include <cstring> 
    #include <string> 
    using namespace std; 

int main(int argc) 
{ 
    const int size = 50; 
    char name[50]; 
    int count; 
    char list[][50] = {"Becky Warren, 555-1223", 
       "Joe Looney, 555-0097", 
       "Geri Palmer, 555-8787", 
       "Lynn Presnell, 555-8878", 
       "Holly Gaddis, 555-8878", 
       "Sam Wiggins, 555-0998", 
       "Bob Kain, 555-8712", 
       "Tim Haynes, 555-7676", 
       "Warren Gaddis, 555-9037", 
       "Jean James, 555-4939", 
       "Ron Palmer, 555-2783" }; 

    cout << "Enter a name or partial name: " << endl; 
    cin.getline(name, size); 
    cin.ignore(); 
    for(count = 0; count < 10 ; count++){ 
    if(strstr(list[count], name)){ 
     cout << list[count]; 
    } 
    } 
    cin.get(); 
    return 0; 
} 
+1

どこにでも '50'を使うと' int const size = 50; 'のポイントは何ですか?そしてあなたは本当に 'list'をスタックに入れて、動的に初期化しますか?そして 'cin.ignore()'も正しく見えません。 –

+0

@JamesKanze、あなたは正しいです。私はちょうど最小限の編集で彼のコードにすばやく修正を投稿しました。 – DhruvPathak

1

まず、あなたのデータ宣言が間違っています。 charの配列を必要としない場合は、文字列配列std::stringまたはchar const*(後者はすべての文字列がリテラルの場合のみ)の配列が必要です。第二に、 おそらく、テーブルを自動変数にしたくないでしょう。あなたが関数内で、後でそれを変更したい、そしてそれを関数が呼び出されるたび を再初期化 ない限り、あなたはおそらく、それは静的になりたい:

static char const* const list[] = 
{ 
    "Becky Warren, 555-1223", 
    "Joe Looney, 555-0097", 
    "Geri Palmer, 555-8787", 
    "Lynn Presnell, 555-8878", 
    "Holly Gaddis, 555-8878", 
    "Sam Wiggins, 555-0998", 
    "Bob Kain, 555-8712", 
    "Tim Haynes, 555-7676", 
    "Warren Gaddis, 555-9037", 
    "Jean James, 555-4939", 
    "Ron Palmer, 555-2783", 
}; 

をそうでない場合、あなたは でstd::vectorstd::stringを、使用したいですそれを初期化するために上記のようなもの:

std::vector<std::string> localList(std::begin(list), 
            std::end(list)); 

(あなたのコード例では、これが必要ではないあなただけのlistを使用することができます。。)

第2に、フリー関数std::getlineを使用し、 にstd::stringを読み込む必要があるため、サイズについて心配する必要はありません。そして、私は あなたがほしいと思うと思わないcin.ignore()。これは、新しい行の後に1つの余分な文字を抽出(そして 無視)しようとします。 は新しい行を入力する必要があります(新しい行があるまでシステムは 文字をプログラムに送信しないため)。

そして、ループの を管理するための明示的な数の要素を使用するのではなく、配列のサイズから派生したもの 自体です。イテレータは最も一般的です:

これはもちろん大文字と小文字を区別します。実際のアプリケーションでは、 はおそらく が正確な一致基準を実装する独自のマッチャー(機能オブジェクト)を作成します。

Matcher m(name); 
char const* const* iter = std::find_if(
        std::begin(list), std::end(list), m); 
while (iter != std::end(list)) { 
    std::cout << *iter << std::endl; 
    iter = std::find_if(iter + 1, std::end(list), m); 
}