创建char数组后,将其填充为垃圾

时间:2019-06-13 17:19:25

标签: c++

我输入了一个单词,我需要用相同数量的符号创建一个新单词,并且新单词必须仅用'_'填充。

int main()
{
char word[30];
cout << "Enter word: ";
gets_s(word);
cout << word;
int k = strlen(word);
cout << "Amount of letters in word: "<< k << endl;
char *temp = new char[k];
for (int i = 0; i < k; i++)
{
    temp[i] = '_';
}
cout << temp << endl;

}

2 个答案:

答案 0 :(得分:12)

使用C字符串,这些字符串确实令人讨厌,通常可以在C ++中避免使用,因此必须必须NUL终止字符缓冲区:

char *temp = new char[k + 1];
for (int i = 0; i < k; i++)
{
  temp[i] = '_';
}
temp[k] = 0; // Terminated

否则,您将继续读入随机存储器并看到各种垃圾。

使用std::string会容易得多:

std::string temp;
for (int i = 0; i < k; ++i) {
  temp += '_';
}

您不必记住要NUL终止,因为std::string不需要它,标准库在内部使用了另一种方法,并且会自动为您处理。

但是,等等,还有更多!

如果您现在就采取行动并使用std::string,则可以使用类似这样的出色工具:

std::string temp(k, '_');

更轻松!

答案 1 :(得分:-1)

在c ++中,当您在运行时创建数组或结构时(堆或堆栈中无关紧要),所有值都被垃圾填满。

为防止可能的错误:

对于结构:

typedef struct
{
    int age;  
    char name[30];

}person;

person emptyPerson;  // emptyPerson age is 0 , name is {0,0,0...}

void runtimeCreatePerson()
{
    person runtTimePerson;
    cout << runtTimePerson.name<< endl;  // this will print garbage values 

    person runtTimePerson2 = emptyPerson; // now runtimePerson has same values with emptyResponse(copy of)

    cout << runtTimePerson2.name<< endl;  // this will print ""

}

int main()
{
    runtimeCreatePerson();
}

对于数组,您必须在创建后填充它:

int i = 0;
int main()
{
    char runtimeArray[50];
    cout << runtimeArray<< endl;  // this will print garbage values 
    for(i=0 ; i < 50 ; i++)
        runtimeArray[i] = 0;
    cout << runtimeArray<< endl;  // this will print ""
}