2016-10-06 5 views
3

Моя программа работала так, как предполагалось, до тех пор, пока я не добавлю часть toupper в свою программу. Я пробовал посмотреть на код ошибки, но это не помогает. Ошибки:Неправильное использование неверно? Рабочий код до тех пор, пока я не ввел в верхний колонтитул

никакой функции согласования не вызвать 2 аргументы как ожидается, один при условии

Так что я знаю, что ошибка в этих двух операторах в моем цикле. Что я сделал не так?

Я хочу, чтобы сделать себе имя, как

Джон Браун пойти Джон Браун

#include <iostream> 
#include <iomanip> 
#include <fstream> 
#include <string> 
using namespace std; 

int main(){ 

    string firstname[5]; 
    string lastname[5]; 
    ifstream fin("data_names.txt"); 
    if (!fin) { 
    cout << "There is no file" << endl; 
    } 
    int i = 0; 
    while(i < 5 && (fin >> firstname[i]) && (fin >> lastname[i])) { 
    firstname[0] = toupper(firstname[0]); 
    lastname[0] = toupper(lastname[0]); 
    i++; 
    } 
    cout << firstname[0] << " " << lastname [0] << endl; 
    cout << firstname[1] << " " << lastname [1] << endl; 
    cout << firstname[2] << " " << lastname [2] << endl; 
    cout << firstname[3] << " " << lastname [3] << endl; 
    cout << firstname[4] << " " << lastname [4] << endl; 

    return 0; 
} 
+0

Какая линия ошибка указывает на? – wallyk

+3

'toupper' ожидает' int', вы передаете ему 'string' - [' toupper' Documentation] (http://www.cplusplus.com/reference/cctype/toupper/). –

+1

'toupper' работает на одном персонаже за раз. Если вы хотите использовать верхнюю часть всей строки, вам нужно сделать цикл, который проходит через строку, применяя 'toupper' для каждого символа. –

ответ

2

Вам нужно ctype.h, чтобы получить надлежащее определение для toupper(). Обычно он реализуется не как функция, а сопоставление массива.

#include <ctype.h> 

Программа имеет несколько недостатков: используя массив строк вместо строки, не перебирая струны правильно, не объявляя, но используя определение C из ToUpper(), не выходя, когда файл делает не существует.

Используйте вместо этого:

#include <ctype.h> 
#include <iostream> 
#include <string> 
using namespace std; 

int main() 
{ 
    ifstream fin ("data_names.txt"); 
    if (!fin) 
    { 
    cerr << "File missing" << endl; 
    return 1; 
    } 
    // not sure if you were trying to process 5 lines or five words per line 
    // but this will process the entire file 
    while (!fin.eof()) 
    { 
     string s; 
     fin >> s; 
     for (i = 0; i < s.length(); ++i) 
      s [i] = toupper (s [i]); 
     cout << s << endl; 
    } 
    return 0; 
} 
+0

Я считаю, что это обычно реализуется как функция в наши дни, потому что так много людей называют это передачей простого символа 'char' в качестве аргумента (который прерывает реализацию массива) –

+0

BTW, заголовок C++ будет' cctype', а затем использовать 'std: : toupper'. – juanchopanza

+0

@juanchopanza не будет содержать код OP, который все еще создает ошибки, если не использует перегрузку параметра C++ 2, так как он передает «строку», когда ожидается «int»? –

3

std::toupper работы на отдельных персонажей, но вы пытаетесь применить его к струнам. Кроме того, добавление #include <cctype>, вам нужно изменить тело вашего while петлю в:

firstname[i][0] = toupper(firstname[i][0]); 
lastname[i][0] = toupper(lastname[i][0]); 
i++; 

Затем он должен работать, как ожидалось. Live demo here

Как M.M услужливо отметил в комментариях, вы должны также проверить, что ваши строки не являются пустыми, прежде чем доступ к их первым символам, то есть что-то вроде

if (!firstname[i].empty()) firstname[i][0] = toupper(...); 

настоятельно рекомендуются.

Имейте в виду, вы, вероятно, потребуется более сложная логика, если вы получаете имена, как McDonald :)

+0

@juanchopanza, о чьей ошибке вы говорите? – mindriot

+1

Технически это должно быть либо 'toupper ((unsigned char) firstname [i] [0]);' (с включенным cctype), либо 'toupper (firstname [i] [0], std :: locale())'. Также было бы неплохо проверить, что строка не пуста для выполнения '[0]' –

+0

@ M.M Я согласен. Код вопроса мог бы получить гораздо более общий обзор. – mindriot

 Смежные вопросы

  • Нет связанных вопросов^_^