Цикл кажется завершается до достижения нулевого символа в C

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

Проблема, которую я получаю, возникает позже в коде, когда я делаю массив (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

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

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

от основного:

  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()? Я читал об этом и, кажется, работает, но я не могу реализовать эти функции.

1 ответ

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

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

while(tokenIndex < numTokens){

Другие вопросы по тегам