2015-01-15 2 views
1

log.txt файл:strtok функция не работает должным образом

2327 - Your account is created on 01/09/15 # 
2327 - Amount:100 withfrawed from your account on 01/09/15 # 

Этот код показывает мне выход в первый раз компиляции и другой другой выход на второй раз компиляции. Что такое ошибка у меня есть сделать

#‎include‬<stdio.h> 
#include<conio.h> 
#include<string.h> 
FILE *fp; 

void main() 
{ 
    int i=0; 
    char temp[10],log[10000],*token; 
    char s1[2] = "#",s2[2] = "-",logger[100][70],no[100][10]; 
    clrscr(); 

    fp=fopen("LOG.TXT","r"); 

    while(fscanf(fp,"%s",temp)!=EOF) 
    { 
     strcat(log,temp); 
     strcat(log," "); 
    } 
    fclose(fp); 
    printf("%s",log); 
    token = strtok(log,s1); 

    while(token!=NULL) 
    { 
     strcpy(logger[i],token); 
     i++; 
     token = strtok(NULL,s1); 
    } 

    i=0; 
    token = strtok(logger[i],s2); 
    while(token!=NULL) 
    { 
     strcpy(no[i],token); 
     i++; 
     token = strtok(logger[i],s2); 
    } 
    getch(); 
} 
+1

ну, вначале, похоже, вы не использовали строку с нулевым завершением для 'strcat()'. –

+0

Кроме того, нет необходимости анализировать дважды два раздельных разделителя. Вы можете использовать 'char * del =" # - "' сразу. И всегда проверяйте успех 'fopen()' –

+0

Извините, но, вставив код, вы говорите, что именно вы делаете, а не то, что вы хотите сделать. Компьютеры всегда делают то, что им говорят, а не то, что они предназначены. Вы точно совершаете ту же ошибку (как вы жалуетесь, что вы действительно делаете) с нами, чем с вашего компьютера. Как мы можем знать, что именно вы хотите сделать и что вы пропустили? –

ответ

2
char log[10000]; 

Здесь log не инициализирован так strcat() будет искать NULL терминатора и log не будет иметь его, потому что это unintialized так что вам необходимо инициализировать log перед выполнением strcat()

Использование неинициализированных переменных приводит к неопределенному поведению, поэтому strtok() нерабочий может быть из-за этого.

Вы можете сделать

char log[10000] = {0}; 

или

memset(log,0,sizeof(log)); 
+0

можно инициализировать журнал как null – leopragi

+0

@leopragi Вы можете проверить изменения того, что можно сделать – Gopi

+0

лучше 'char log [10000] =" ";' do not? –

2

Ваша проблема, скорее всего, здесь:

strcat(log,temp); 
strcat(log," "); 

Вы не инициализировать log что означает, что содержимое является неопределенными и используя log th путь ведет к undefined behavior.

Помните, что strcat ищет символ конца строки '\0', чтобы знать, где он должен начинаться, а неинициализированные локальные нестатические переменные будут иметь кажущееся случайное содержимое.

+0

OP вероятно должен «memset (log, 0, sizeof (log));' очень рано в его программе. –

+0

Если я инициализирую журнал, он показывает всю строку как (null) – leopragi

+0

, не так ли, как 'while() {}' цикл должен находиться под 'if (fp)'? –

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