2017-02-23 8 views
0

Ниже представлен раздел Tokenizer, который я построил. Пользователь набирает строку, которую они хотят tokenize, эта строка хранится в массиве char, а нулевой символ ('\ 0') помещается, как только заканчивается строка. Этот раздел кода, кажется, работает нормально после тестирования его несколько раз.Петля, кажется, заканчивается перед достижением нулевого символа в C

Проблема я получаю происходит позже в коде, когда я делаю массив (tokenArray) массивов (newToken). Я использую функции, чтобы получить количество токенов и длину токена.

Я ввел строку «калькулятор карандаша для проверки». Затем я сохраняю каждый токен в массив. Проблема заключается в том, когда я иду печатать содержимое массива, цикл, который у меня печатает, останавливается раньше, чем нужно.

Вот пример ввода/вывода. Мои комментарии (не в коде) отметил

$testing pencil calculator //string entered 

complete index: 0  //index of the entire array, not the tokenized array 
token length: 7   //length of 1st token "testing" 
pointer: 0xbf953860 
tokenIndex: 0   //index of the token array (array of arrays) 
while loop iterations: 4 //number of times the while loop where i print is iterated. should be 7 
test      //the results of printing the first token 

complete index: 8             
token length: 6   //next token is "pencil"                    
tokenIndex: 1              
while loop iterations: 5 //should be 6          
penci     //stops printing at penci  

complete index: 15             
token length: 10   //final token is "calculator"           
pointer: 0xbf953862             
tokenIndex: 2               
while loop iterations: 5 //should be 10            
calcu     //stops printing at calcu 

для жизни меня, я просто не могу понять, почему цикл, пока выход до того, как предполагается. Я сомневаюсь, что это единственная проблема с моей методологией, но пока я не смогу это понять, я не могу обращаться к другим ошибкам.

Ниже приводится часть моего кода, который отвечает за это:

от основной:

completeString[inputsize] = '\0'; 

    char tokenArray[numTokens+1]; 
    tokenArray[numTokens] = '\0';  
    putTokensInArray(tokenArray, completeString); 

метод, где я получаю сообщение об ошибке:

char ** putTokensInArray(char tokenArray[], char * completeString){ 
    int completeIndex = 0; 
    int tokenIndex = 0; 

    while(tokenArray[tokenIndex] != '\0'){ 
    int tokenLength = tokenSize(completeString, completeIndex); 
    char newToken [tokenLength+1]; 
    newToken[tokenLength] = '\0'; 
    tokenArray[tokenIndex] = *newToken; 

    printf("\ncomplete index: %d", completeIndex); 
    printf("\ntoken length: %d", tokenLength); 
    printf("\ntokenIndex: %d\n", tokenIndex); 

    int i = 0; 
    while(newToken[i] != '\0'){ 
     newToken[i] = completeString[i + completeIndex]; 
     i++; 
    } 
    completeIndex += (tokenLength+1); 

    printf("while loop iterations: %d\n", i); 

    for(int j = 0; newToken[j] != '\0'; j++){ 
     printf("%c", newToken[j]); 
    } 

    tokenIndex++; 
    tokenLength = 0; 

    }//big while loop 
}//putTokensInArray Method 

Я попробовал несколько но просто не может понять его. Я новичок в C, поэтому вполне возможно, что я делаю ошибки указателя или получаю доступ к памяти, которой я не должен быть; на этой ноте, как мне реализовать malloc() и free()? Я читаю об этом и, кажется, работаю, но я не могу реализовать эти функции.

+0

'* newToken' вызывает неопределенное поведение (вы читали первый символ из' newToken', но вы никогда не инициализируется содержание) –

+0

Кроме того, ваша функция объявляется return 'char **', но у вас нет оператора 'return' –

+0

Я еще не выполнил оператор return. Так что вы говорите, что мне нужно инициализировать содержимое массива, когда я его создаю? Итак, я бы просто зациклил массив и поместил случайное значение во все индексы? –

ответ

0

Вы передаете неинициализированный массив символов вашей функции putTokensInArray. Позже в этой функции в условии цикла while вы проверяете для \0 для каждого элемента, начиная с 0. Однако, поскольку массив не инициализирован, эти символы могут быть ЛЮБЫМИ символами. Может быть \0 до numTokens+1-го элемента.

Чтобы устранить эту проблему, передайте длину массива символов i.e. numTokens в putTokensInArray в качестве дополнительного аргумента. Затем в цикле в то время, сделайте следующую проверку условие вместо:

while(tokenIndex < numTokens){

+0

Спасибо.Это может звучать глупо, но есть ли правильный или стандартный способ инициализировать содержимое массива в C? Поместим ли мы -1 в каждый индекс или что-то в этом роде? Или это, где malloc и бесплатно вступают в игру? Я новичок, поэтому я все еще пытаюсь понять все это. Я ценю вашу помощь! –

+0

@OmarKhalik, инициализирующий массив символов, очень прост. 'char tokenArray [numTokens + 1] =" ";' Это приведет к инициализации каждого элемента до 0. – VHS

Смежные вопросы