Ich habe ein Programm, das eine unbekannte Anzahl von Zeichenfolgen von einem Benutzer annehmen soll. Es sollte überprüfen und sehen, ob eine Zeichenfolge bereits eingegeben wurde, so dass es keine Duplikate im dynamischen Array geben wird.Wenn Anweisung nicht nullptr
Das Problem ist, dass ich das Programm nicht erkennen kann, wenn ein Array-Steckplatz nichts enthält. Ich habe sowohl NULL als auch NULLPTR verwendet und keiner funktioniert. Was mehr ist, obwohl ich das Array noch nicht vollständig initialisiert habe, ist immer noch etwas an dem Ort.
#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;
}
ich kann nicht herausfinden, was ich bin fehlt oder an der falschen Stelle setzen
Welches Buch durch alle Mitglieder nach iterieren lesen Sie?Der Grund, warum ich frage, ist, dass Leute, die Bücher lesen, besseren Code zu schreiben scheinen. Sie verwenden viel zu viele C-Funktionen, wenn es geeignetere C++ - Alternativen gibt, und ** ein Teil Ihres Codes ruft undefiniertes Verhalten auf ** (zB 'char ** temp;' ... 'delete * temp;' wie dort ist keine Voraussetzung, dass 'temp' irgend etwas vernünftiges enthält,' erfordert = neues Zeichen * [requiresize]; '...' delete requires; 'und ähnlich' requires [i] = new char [256]; '...' delete * benötigt; 'benutze 'löschen' fälschlicherweise, wo' löschen [] 'verwendet werden soll ... – Sebivor