如果语句没有捕获nullptr

时间:2017-05-02 03:32:13

标签: c++ if-statement nullptr

我有一个程序应该从用户那里获取未知数量的字符串。它应该检查并查看是否已经输入了一个字符串,以便动态数组中没有重复项。

问题在于我无法让程序识别阵列插槽何时没有任何内容。我已经使用了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;
}

我无法弄清楚我错过了什么或放错了地方

2 个答案:

答案 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::stringstd::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);
}