2015-10-14 88 views
0

在我的C++学习复制构造函数的使用等等,我们得到了一个我们要完成的程序的模板,但是我的输出在我的输出流中引入了时髦的asci字符。C++,Odd Asci输出与我的程序

继承人我的主类:

#include <iostream> 
using namespace std; 
#include "Contact.h" 
using namespace sict; 

    int main(){ 
     Contact c("Empty Contact", 3); 
     c.display(); 
     cout << "Enter Contact information: " << endl; 
     c.read(); 
     c.display(); 
     cout << endl; 
     for (int i = 0; i < 1000000; i++){ 
     Contact temp("Testing the contact with a looooong " 
        "name that should be taken care of", 20); 
     if (!(i % 100000)){ 
      cout << i << ":" << endl; 
      temp.display(); 
     } 
     } 
     return 0; 
    } 

Contact.cpp:

#include <cstring> 
#include <iostream> 
#include "Contact.h" 
using namespace std; 

namespace sict{ 


    void Contact::display()const{ 
    //display the name and go to new line 
     cout<< _name << endl; 
    // loop through elements of _pn up to _noPN and display them one by one 
     for(int i = 0; i < _noPN ; i++){ 
     _pn[i].display(); 
     } 
    // draw a 40 char line using '-' and go to new line 
    cout<<"----------------------------------------"<<endl; 


    } 
    Contact::Contact(){ 
     _pn = nullptr; 
    } 
    Contact::Contact(const char* name, int number){ 
     strncpy(_name, name,40); 
     _pn = new PhoneNumber[number]; 
     _noPN = number; 

    } 
    Contact::~Contact(){ 
     delete[] _pn; 

    } 


    void Contact::read(){ 
    cout << "Contact Name: "; 
    cin.getline(_name, 41, '\n'); 
    cout << "Please enter " << _noPN << " phone numbers: " << endl; 
    for (int i = 0; i < _noPN; i++){ 
     cout << i + 1 << ": "; 
     _pn[i].read(); 
    } 
    } 



    bool Contact::isEmpty()const{ 
    return _pn == (PhoneNumber*)0; 
    } 
    void Contact::setEmpty(){ 
    _name[0] = 0; 
    _noPN = 0; 
    _pn = (PhoneNumber*)0;// same as _pn = nullptr; 
    } 
} 

输出故障:

Empty Contact 
---------------------------------------- 
Enter Contact information: 
Contact Name: John Doe 
Please enter 3 phone numbers: 
1: Home, 123 1234567 
2: Cell, 234 2345678 
3: Work, 345 3456789 
John Doe 
Home..........., 123 123-4567 
Cell..........., 234 234-5678 
Work..........., 345 345-6789 
---------------------------------------- 
    0: 
    Testing the contact with a looooong nameôoc·lÐ 
    ---------------------------------------- 
    100000: 
    Testing the contact with a looooong nameôoc·lÐ 
    ---------------------------------------- 
    200000: 
    Testing the contact with a looooong nameôoc·lÐ 
    ---------------------------------------- 
    300000: 
    Testing the contact with a looooong nameôoc·lÐ 
    ---------------------------------------- 
    400000: 
    Testing the contact with a looooong nameôoc·lÐ 
    ---------------------------------------- 
    500000: 
    Testing the contact with a looooong nameôoc·lÐ 
    ---------------------------------------- 
    600000: 
    Testing the contact with a looooong nameôoc·lÐ 
    ---------------------------------------- 
    700000: 
    Testing the contact with a looooong nameôoc·lÐ 
    ---------------------------------------- 
    800000: 
    Testing the contact with a looooong nameôoc·lÐ 
    ---------------------------------------- 
    900000: 
    Testing the contact with a looooong nameôoc·lÐ 
    ---------------------------------------- 

它是什么想的样子:

Empty Contact 
---------------------------------------- 
Enter Contact information: 
Contact Name: John Doe 
Please enter 3 phone numbers: 
1: Home, 123 1234567 
2: Cell, 234 2345678 
3: Work, 345 3456789 
John Doe 
Home..........., 123 123-4567 
Cell..........., 234 234-5678 
Work..........., 345 345-6789 
---------------------------------------- 

0: 
Testing the contact with a looooong name 
---------------------------------------- 
100000: 
Testing the contact with a looooong name 
---------------------------------------- 
200000: 
Testing the contact with a looooong name 
---------------------------------------- 
300000: 
Testing the contact with a looooong name 
---------------------------------------- 
400000: 
Testing the contact with a looooong name 
---------------------------------------- 
500000: 
Testing the contact with a looooong name 
---------------------------------------- 
600000: 
Testing the contact with a looooong name 
---------------------------------------- 
700000: 
Testing the contact with a looooong name 
---------------------------------------- 
800000: 
Testing the contact with a looooong name 
---------------------------------------- 
900000: 
Testing the contact with a looooong name 
---------------------------------------- 

正如你所看到的,那里有在名称末尾添加一些ASCII字符

我可以添加程序的其余部分但它是安静冗长的,如果要求它我会编辑这篇文章,将它们添加。

+0

没有'Contact'类的定义,我们真的不能帮助。这显然是问题所在。 – owacoder

+0

您需要显示'Contact'构造函数 - 问题很可能存在(并且可能缺少字符串的null终结符)。 – Rostislav

+0

对不起,添加它。 – andirew

回答

1

strncpy(_name, name,40);不会在字符串末尾添加空终止符。要修复它,只需添加一行_name[40] = '\0'。对于短字符串,它只是恰好复制它。对于更长的琴弦 - 它停在第40个符号处。

cppreference

如果被复制整个阵列SRC之前达到计数,所得到的字符数组是不是空终止。

+0

这解决了它!谢谢! – andirew

+0

@andirew不要忘记接受答案;) – Rostislav