2015-10-13 5 views
0

Im пытается написать простую программу, которая будет читаться в списке имен и позволит вам просматривать их. У меня проблема с моей cin.getline и моей strstr. Im, новый для C++ и im, с трудом поднимает голову вокруг строки c и ее функций. Я получаю ошибку из cin.getline не может преобразовать параметр 1 из «станд :: ifstream» в «символ *» и не может преобразовать параметр 1 из «полукокса» до «символ *»Проблема с cin.getline и strstr

Я получаю ошибку от strstr ошибка C2665: «strstr»: ни один из 2-х перегрузок не может конвертировать все типы аргументов

#include <iostream> 
#include <string> 
#include <fstream> 
#include <cstring> 

using namespace std; 

int main() 
{ 
const int SIZE = 50; 
int size = 0; 

// Array of product descriptions 
char phoneDirectory[SIZE]; 

char name; // For user input 
char *strPtr = NULL; // Result from strstr 

ifstream inFile; 
inFile.open("phonebook"); 
while (!inFile.fail()) 
{ 
cin.getline(inFile,phoneDirectory[size]); 
size++; 
} 
inFile.close(); 

// Get user input 
cout << "Enter a name to search for: "; 
cin.getline(name, SIZE); 

// Search for the string 
int index = 0; 
while(index < size) 
{ 
strPtr = strstr(phoneDirectory[index], name); 
if (strPtr != NULL) 
break; 
index++; 
} 

// Output the result of the search 
if (strPtr == NULL) 
cout << "No matching names were found.\n"; 
else 
cout << phoneDirectory[index] << endl; 
return 0; 
} 

I cant seem to fix the cin.getline's and the strstr. 

ответ

0

char name не представляет собой строку, но один одиночный символ. Функция getline принимает указатель на символ и целое число, и в вашем случае вы кормите его символом и целым числом.

Кроме того, в C++ я бы предложил использовать std :: string вместо массива символов. Это намного проще в обращении и меньше подвержено ошибкам.

Я скорректировал ваш код, чтобы сделать то, что, как я думаю, вы ищете. дайте мне знать, если это не то, что вы ищете:

#include <iostream> 
#include <string> 
#include <fstream> 
#include <cstring> 

using namespace std; 

int main() 
{ 
    const int SIZE = 50; 
    int size = 0; 

    // Array of product descriptions 
    string phoneDirectory[SIZE]; 

    string name; // For user input 
    char *strPtr = NULL; // Result from strstr 

    ifstream inFile; 
    inFile.open("phonebook"); 
    while (!inFile.fail()) 
    { 
     getline(inFile, phoneDirectory[size]); 
     size++; 
    } 
    inFile.close(); 

    // Get user input 
    cout << "Enter a name to search for: "; 
    getline(cin, name); 

    // Search for the string 
    int index = 0; 
    while(index < size) 
    { 
     strPtr = strstr(phoneDirectory[index].c_str(), name.c_str()); 
     if (strPtr != NULL) 
      break; 
     index++; 
    } 

    // Output the result of the search 
    if (strPtr == NULL) 
     cout << "No matching names were found.\n"; 
    else 
     cout << phoneDirectory[index] << endl; 

    return 0; 
} 

Если вы действительно хотите придерживаться массива символов, вот что ваш код должен выглядеть следующим образом:

#include <iostream> 
#include <string> 
#include <fstream> 
#include <cstring> 

using namespace std; 

int main() 
{ 
    const int DIRECTORY_SIZE = 50; 
    const int STRING_SIZE = 50; 
    int size = 0; 

    // Array of product descriptions 
    char phoneDirectory[DIRECTORY_SIZE][STRING_SIZE]; 
    char name[STRING_SIZE]; // For user input 
    char *strPtr = NULL; // Result from strstr 

    ifstream inFile; 
    inFile.open("phonebook"); 
    while (!inFile.fail() && size < DIRECTORY_SIZE) 
    { 
     inFile.getline(phoneDirectory[size], STRING_SIZE); 
     size++; 
    } 
    inFile.close(); 

    // Get user input 
    cout << "Enter a name to search for: "; 
    cin.getline(name, STRING_SIZE); 

    // Search for the string 
    int index = 0; 
    while(index < size) 
    { 
     strPtr = strstr(phoneDirectory[index], name); 
     if (strPtr != NULL) 
      break; 
     index++; 
    } 

    // Output the result of the search 
    if (strPtr == NULL) 
     cout << "No matching names were found.\n"; 
    else 
     cout << phoneDirectory[index] << endl; 

    return 0; 
} 
+0

Спасибо, что помогли много но он все еще дает ошибку на strPtr = strstr (phoneDirectory [index] .c_str(), name.c_str()) ;. У меня есть вопрос, почему вы должны изменить его на строку вместо char? – Doe

+0

Здесь, похоже, работает нормально. Преимущество использования строки заключается в том, что вы не обязаны указывать длину строки функции getline. Это менее ограничительный. Я отправлю ответ, не используя строку в 2 сек. –

+0

Я обновил свой ответ. Посмотрите также на std :: vector. Это хорошая практика, чтобы использовать их по массивам. –