2015-03-10 2 views
0

В приведенном ниже коде используется метод strtok и хранение слов, полученных strtok в словах char * array. Затем я пытаюсь напечатать слова в словах char * array в обратном порядке. Я получаю дополнительное слово, о котором я понятия не имею, откуда оно взялось. любая помощь?Проблема с printf on char array

Код:

#include <stdio.h> 
#include <string.h> 

/* What characters are used to separate words? */ 
#define DELIMITERS " " 
#define MAX_SIZE 100 

int main() { 
/* A simple string for illustration */ 
char line[] = "seven years ago our fathers brought forth"; 

/* A pointer to be used by strtok() */ 
char *ptr; 
char *words[MAX_SIZE]; 

    printf("Before processing: \"%s\"\n", line); 

    /* Find the first word in the line */ 
    ptr = strtok(line, DELIMITERS); 

    int i = 0; 
    while (ptr != NULL) { 
    /* process the current word */ 
    /*printf("\"%s\"\n", ptr);*/ 

    words[i] = ptr; 

    /* get the next word in the line */ 
    ptr = strtok(NULL, DELIMITERS); /* NB: line is NOT the first argument! */ 
    i++; 
    } 

    /* Observe that strtok() modifies the string we have been scanning */ 
    printf("After processing: \"%s\"\n", line); 

    int j; 
    puts("Outputting words in reverse order : "); 
    /* print out strings in reverse order */ 
    for (j = (sizeof(&words) - 1); j >= 0; j--) { 
    printf("\"%s\"\n", words[j]); 
    } 

    return 0; 
} 

Выход:

./a.out 
Before processing: "seven years ago our fathers brought forth" 
After processing: "seven" 
Outputting words in reverse order : 
"free" 
"forth" 
"brought" 
"fathers" 
"our" 
"ago" 
"years" 
"seven" 

Где бесплатно идет от ??

ответ

2

проблемы в том, что sizeof(&words) - 1 это неправильно, потому что sizeof(&words) является размер указателя т.е. sizeof(void *), который на вашей платформе, кажется 8 так ваш цикл затем

for (j = 7 ; j >= 0; j--) 

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

for (j = i - 1 ; j >= 0; j--) 

Как, почему это печать free, что очень непредсказуемо, в вашем с аза может быть пришедшего из отладочных символов в вашем бинарном файле, но при чтении uninitalized данных результат не предсказуем в моем случае печататься значение было

���A� 

, который не является даже печати.

+0

Да, но откуда «бесплатно»? –

+0

@NathanTuggy Я предполагаю, что он отправляется из отладочных символов, поскольку вы получаете доступ к неинициализированным данным. –

+0

Это кажется правдоподобным, но было бы неплохо иметь подробное подробное объяснение этого конкретного симптома. –