Консультация № 168512
29.05.2009, 19:46
0.00 руб.
0 2 2
Здраствуйте,
Пробую использовать cin и cout в for цикле, в приложении код, компилируется нормально, но при выполннении выбрасывает ошибку на команде cin>>tmpChar; подскажите в чем проблема и как её решить?
заранее спасибо.
з.ы. Использую Dev-C++

Приложение:
#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
int studSk;
char* tmpChar;
char* tmpChar2;

cout<<"Skolko: ";
cin>>studSk;
for(int i = 1; i < studSk; i++) {
cout<<"vvedite "<<i<<" imia: "<<endl;
cin>>tmpChar;
сout<<endl<<"vvedite "<<i<<" familiju: ";
cin>>tmpChar2;
cout<<endl;
}
system("PAUSE");
return EXIT_SUCCESS;
}

Обсуждение

Неизвестный
29.05.2009, 20:01
общий
это ответ
Здравствуйте, Станислав.
сначала надо бы выделить память для результата, например :
char* tmpChar = new char[255];
char* tmpChar2= new char[255];
5
Неизвестный
29.05.2009, 21:06
общий
это ответ
Здравствуйте, Станислав.
Вы объявили 2 указателя
Код:

char* tmpChar;
char* tmpChar2;

В C++ автоматические переменные не инициализируются ничем. Фактически в ваших переменных-указателях содержится "мусор", который был в памяти. Поэтому когда потоковый класс cin, которому Вы передали эти указатели как параметры, при попытке записи в память по адресу, который в этих указателях содержится, вызывает исключение. Т.к. приложение не может писать в память куда ему вздумается.

Обязательно надо выделить память для хранения этих значений. Не обязательно делать это динамически используя new или malloc(). Для вашей задачи
вполне достаточно:
Код:

char tmpChar[100];
char tmpChar2[100];

Здесь тоже фактически объявляются два константных указателя. Но на область памяти размером в 100*sizeof(char) байт.
Следует сказать, что это не застрахует Вас от ошибок если пользователь, от нечего делать, введет имя длиннее этого размера.
Лучше пользоваться.
Код:

cin.get(tmpChar,100);

Вторым параметром передается размер принимающего буфера.

Учитывая, что Вы пишете на C++ лучше пользоваться вместо указателей на char строковым классом из STL string который избавит Вас от этих проблем.
Код:

#include <limits>
#include <iostream>
#include <string>

using namespace std;

int main(int argc, char *argv[])
{
int studCount;
string firstName,lastName;
cout<<"Count: ";
cin>>studCount;
for(int i = 0; i < studCount; ++i)
{
cout<<"Input "<<i+1<<" Firstname: ";
cin>>firstName;
cin.ignore(numeric_limits<streamsize>::max(),'\n');
cout<<"Input "<<i+1<<" Lastname: ";
cin>>lastName;
cin.ignore(numeric_limits<streamsize>::max(),'\n');
cout<<endl;
}
system("PAUSE");
return 0;
}
5
Форма ответа