将C字符串与初始化字符串数组进行比较

时间:2011-12-15 08:25:14

标签: c++ arrays string

这个程序应该有一个包含10个字符串对象的数组,用于存放人们的姓名和电话号码。它要求用户输入要在数组中搜索的名称或部分名称,并且应显示数组中与输入的字符串匹配的任何条目。我在执行代码时遇到问题。

#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;
}

2 个答案:

答案 0 :(得分:1)

首先,您的数据声明是错误的。你不想要一个数组 char,您需要一个字符串数组,std::stringchar 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。)

其次,你应该使用自由函数std::getline,然后阅读 一个std::string,所以你不必担心大小。我没有 认为你想要cin.ignore()。这将尝试提取(和 忽略)新行之后的一个额外字符,很可能 需要输入一个额外的新行(因为系统不会发送任何新行) 字符到你的程序,直到有一个新行。)

并且您不希望使用明确数量的元素来管理 循环,而是从数组大小派生的东西 本身;迭代器将是最通用的:

for ( char const* const* iter = std::begin( list );
        iter != std::end( list );
        ++ iter ) {
    if ( std::search( *iter, *iter + strlen( *iter ),
                      name.begin(), name.end() )
            != *iter + strlen( *iter ) ) {
        std::cout << *iter << std::endl;
}

这当然是区分大小写的;在一个真实的应用程序中,你会 可能会编写自己的匹配器(一个功能对象) 实施完全匹配标准;同样,你会用 std::find_if,例如:

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 );
}

答案 1 :(得分: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;
}