2014-12-13 2 views
-2

Я пытаюсь сделать объект с примитивной таблицей символов и STL.Char возвращает weird output C++

Я искал, как 30 вопросов, касающихся stackoverflow о том же предмете, но он не дал мне ответов (я думаю, что я не способен их читать).

Так оно работает нормально, когда я заполняю информацию, но после того, как я попытаюсь напечатать их на консоли, они дают странные символы: «╠; ╠; ╠; ²» Я не знаю, почему это не моя самая сильная область , Я попытался установить char в NULL.

Спасибо, и мне очень жаль этот глупый вопрос.

Мой Object.h файл:

#ifndef Object_H 
#define Object_H 

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

using namespace std; 

class Object 
{ 
    private: 

    char Name[100]; 
    char Title[50]; 
    char Phonenumber[30]; 
    char RoomNumber[15]; 

    public: 

    //default 
    Object(); 

    //overload 
    Object(char, char, char, char); 

    char getName() const; 
    char getTitle() const; 
    char getPhno() const; 
    char getRoomnro() const; 

    ~Object(); 

#endif 

Мои Object.cpp

#include "Object.h" 

Object::Object(){ 
    Name[100] = {0}; 
    Title[50] = { 0 }; 
    Phonenumber[30] = { 0 }; 
    RoomNumber[15] = { 0 }; 
} 

Object::Object(char name, char title, char phonenumber, char roomnumber){ 
    Name[100] = name; 
    Title[50] = title; 
    Phonenumber[30] = phonenumber; 
    RoomNumber[15] = roomnumber; 
} 

Object::~Object(){ 
} 

//getterit 
char Object::getName() const { 
    return Name[100]; 
} 

char Object::getTitle() const { 
    return Title[50]; 
} 

char Object::getPhno() const { 
    return Phonenumber[30]; 
} 

char Object::getRoomnro() const { 
    return RoomNumber[15]; 
} 

Мой main.ccp

#include <string> 
#include <vector> 
#include <iostream> 
#include <fstream> 
#include <iomanip> 

#include "Henkilo.h" 

using namespace std; 

void objectFiller(vector<Object>&); 

void printObject(const vector<Object>&); 

int main() { 

vector<Object> ObjectList; 

    objectFiller(ObjectList); 

    printObject(ObjectList); 
} 

void objectFiller(vector<Object>& newObjectList){ 
     char name[100]; 
     char title[50]; 
     char phonenumber[30]; 
     char roomnumber[15]; 

     int size; 

     cout << "How many people: "; cin >> size; 

     for (int i = 0; i < size; i++) 
     { 
      cout << "Name: "; 
      cin >> name; 
      cout << "Title: "; 
      cin >> title; 
      cout << "Phonenumber: "; 
      cin >> phonenumber; 
      cout << "Roomnumber: "; 
      cin >> roomnumber; 

      Object newObject(name[100], title[50], phonenumber[30], roomnumber[15]); 

      newObjectList.push_back(newObject); 
      cout << endl; 
}; 
     } 
     cout << endl; 
    } 

    void printObject(const vector<Object>& newObjectList) 
    { 
     unsigned int size = newObjectList.size(); 

     for (unsigned int i = 0; i < size; i++){ 
      cout << newObjectList[i].getName() << " ; " << newObjectList[i].getTitle() << " ; " << newObjectList[i].getPhno() << " ; " << newObjectList[i].getRoomnro() << endl; 
      cout << endl; 
     } 
    } 
+0

'Имя [100] = имя;' ... Это не может работать? Вам не разрешено использовать std :: string? – drescherjm

+0

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

+0

'Объект newObject (имя [100], название [50], номер телефона [30], номер комнаты [15]);' Конечно, не делает так, как вы думаете. Это фактически передает 1 символ, который находится за концом каждого из ваших массивов символов, вызывающих неопределенное поведение. имя [100] - это один символ за концом массива имен. Вы передаете этот символ только не всему массиву. Его даже не разрешает доступ к имени [100]. Это неопределенное поведение. – drescherjm

ответ

0

Этот конструктор не так, вы берете 4-х символов в качестве аргументов и назначить их вне массива (действительный индекс для имени [100] равен 0..99)

Object::Object(char name, char title, char phonenumber, char roomnumber){ 
    Name[100] = name; 
    Title[50] = title; 
    Phonenumber[30] = phonenumber; 
    RoomNumber[15] = roomnumber; 
} 

если вы хотите сохранить родные массивы, то вам необходимо скопировать строки в них

Object::Object(char* name, char* title, char* phonenumber, char* roomnumber) 
{ 
    strcpy(Name, name); 
    strcpy(Title, title); 
    strcpy(Phonenumber, phonenumber); 
    strcpy(RoomNumber, roomnumber); 
} 

Теперь выше решение имеет еще несколько проблем, размеры, например, если вы объявляете массивы как строки он более гибкий.

с

std::string Name; 
std::string Title; 
std::string PhoneNumber; 
std::string RoomNumber; 

конструктор может выглядеть

Object::Object(char* name, char* title, char* phonenumber, char* roomnumber) 
{ 
    Name = (name != NULL)?name:""; 
    Title = (title != NULL)?title:""; 
    Phonenumber = (phonenumber!=NULL)?phonenumber:""; 
    RoomNumber = (roomnumber!=NULL)?roomnumber:""; 
} 
1

Во-первых, нет абсолютно никаких оснований для использования символьных массивов здесь. Ваш класс Object не является простым struct, поэтому аргументы, которые могли быть использованы, то есть «моя структура должна быть совместима с C, поэтому мне нужно использовать массивы символов», не применяется.

Поэтому используйте std::string, и большинство ваших проблем исчезнет.

#include <string> 
class Object 
{ 
    private: 
     std::string Name; 
     std::string Title; 
     std::string Phonenumber; 
     std::string RoomNumber; 

    public: 
     Object(); 

    //overload 
     Object(const std::string&, const std::string&, 
       const std::string&, const std::string&); 

     std::string getName() const; 
     std::string getTitle() const; 
     std::string getPhno() const; 
     std::string getRoomnro() const; 
    }; 

Обратите внимание, что Object конструктор принимает 4 зЬй :: строка путем ссылки.

Затем вы переписываете свои функции с помощью этого интерфейса.

#include "Object.h" 
using namespace std;  
Object::Object(){} 

Object::Object(const string& name, const string& title, 
       const string& phonenumber, const string& roomnumber) : 
       Name(name), Title(title), Phonenumber(phonenumber), 
       RoomNumber(roomnumber) 
{} 

Обратите внимание, что конструктор по умолчанию пуст, так как std :: string по умолчанию пусты. Конструктор 4 аргументов просто берет переданные строки и инициализирует элементы информацией (обратите внимание на использование initialization list.

Затем мы добираемся до ваших get... функций. Исходные ошибочны.Например:

char Object::getName() const { 
    return Name[100]; 
} 

Во-первых, тип возвращаемого значения char, что означает, что один символ, а не строка, возвращается. Во-вторых, вы возвращаете символ, который находится по адресу Name[100], что неверно. Переход в позицию 100 - это доступ за пределы границ.

Если ваша цель состояла в том, чтобы вернуть массив Name, вы не можете возвращать необработанные массивы, подобные этому на C++. Но давайте отбросим все это и перепишем его правильно, учитывая, что мы используем std::string.

std::string Object::getName() const { return Name; } 

Оставьте то же изменение с другой функцией get....

Последнее, ваш вход необходимо изменить. Поскольку cin для std::string останавливается в первом пробеле, для этого потребуется переписать с помощью getline, так как getline не останавливается на первом символе пробела.

for (int i = 0; i < size; i++) 
{ 
    cout << "Name: "; 
    getline(cin, name); 
    cout << "Title: "; 
    getline(cin, title); 
    cout << "Phonenumber: "; 
    getline(cin, phonenumber); 
    cout << "Roomnumber: "; 
    getline(cin, roomnumber); 
} 

Это должно быть большинство изменений, которые вам понадобятся.