我有一个程序应该从用户那里获取未知数量的字符串。它应该检查并查看是否已经输入了一个字符串,以便动态数组中没有重复项。
问题在于我无法让程序识别阵列插槽何时没有任何内容。我已经使用了NULL和nullptr,但都不起作用。更重要的是,尽管我还没有对数组进行全面初始化,但仍有一些东西存在。
#include "string.h"
#include "stdio.h"
#include "stdlib.h"
#include "new"
int _tmain(int argc, _TCHAR* argv[])
{
//Variables
int i=0,end=0,requiresSize=1;
char ** temp;
char item[256]="a";
char ** requires;
//Requires is initialized as an array, but the individiual slots are not
requires = new char * [requiresSize];
while(strcmp(item,"q-")){
end=0;
printf("Enter h- for help.\nEnter q- to quit.\n");
printf("Please enter a string\n");
gets_s(item);
printf("%s\n",item);
if(!strcmp(item,"h-")){
printf("Enter a string to add to the list.\nEnter p- to print the list.\n");
end=1;
}
if(!strcmp(item,"q-")){
break;
}
if(!strcmp(item,"p-")){
if(requires[0]!=nullptr){
for(int j=0;j<requiresSize;j++){
printf("%d. %s\n",j,&requires[j]);
}
}
end=1;
}
while(end==0){
//if search index is larger than size of the array,reallocate the array
if(i>= requiresSize){
temp = new char * [requiresSize*2];
//Initialize each element in temp
for(int j=0;j<requiresSize*2;j++){
temp[j]= new char[256];
}
for(int j =0;j<requiresSize;j++){
//for each element in requires, copy that element to temp
strncpy_s(temp[j],_TRUNCATE,requires[j],_TRUNCATE);
}
delete *requires;
requires = temp;
requiresSize = requiresSize *2;
}
//if the index at requires is not empty, check to see if it is the same as given item
if(requires[i]!= nullptr){//This should be returning false and preventing the nested if from running, but doesn't
if(!strcmp( item, requires[i])){//runtime error occurs here from trying to access requires[i]
//if they are the same, break out of the loop, item is already included
break;
}else{
//otherwise, increase the index and check again (continue loop)
i++;
break;
}
}else{
//if the index is empty, add the item to the list and break out of loop
requires[i]= new char [256];
strncpy_s(requires[i],_TRUNCATE,item,_TRUNCATE);
break;
}
}
}
delete *temp;
delete requires;
return 0;
}
我无法弄清楚我错过了什么或放错了地方
答案 0 :(得分:2)
requires = new char * [requiresSize];
这将使用default initialization创建一个新的指向char的数组。默认初始化数组会导致其元素的默认初始化。对于非类和非数组类型(例如指针),默认初始化不执行任何操作。因此,未指定每个元素的值,并且不一定等于nullptr
。
这就是为什么您的if
条件并不总是成功的原因。并不是因为它未能匹配nullptr
值,而是您正在测试的某些值不等于nullptr
,因为没有任何值将它们设置为nullptr
首先是()
。
否则,什么都不做:具有自动存储持续时间的对象(及其子对象)被初始化为不确定值。
您可以在尺寸之后添加nullptr
来执行value initialization。值初始化数组会导致每个数组元素的值初始化。对于非类和非数组类型,值初始化与赋值为零具有相同的效果,它会将每个元素的内容初始化为requires = new char * [requiresSize]();
指针数组:
std::vector<std::string>
否则,该对象被零初始化。
然而,没有理由在这里使用指针数组。使用标准库容器,如jmeter.properties
。
答案 1 :(得分:0)
查看未初始化的内容是不好的,因为你不知道它里面有什么。所以,即使你没有初始化它,你的数组中也有东西也不是问题,问题是你试图访问那些东西。
创建变量后,始终将初始化变为默认值,然后使用它们。
其次,我建议您使用std::string
和std::vector
吗?
使用std::vector
,您可以:
myVector.push_back("Whatever");
myVector.at(0); // this will return an out of reach exception if it doesn't exist
std :: vector会随着你的使用而增长,你可以用
之后迭代所有成员for (int i = 0; i < myVector.size(); i++)
{
// Do stuff myVector.at(i);
}