这个程序应该有一个包含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;
}
答案 0 :(得分: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::vector
和std::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;
}