Open AndrewGavril opened 11 months ago
@AndrewGavril покажите, пожалуйста, пример - как правильно и как не правильно (и желательно возможные исключения из правила:)
Плохой пример:
void search_time(char** array_text, int *count_sentence){
for(int i = 0; i < *count_sentence; i++){
int hours = 0;
int minutes = 0;
int seconds = 0;
int flag = 0;
char* word;
while((word = strtok(array_text[i], " ,")) != NULL){
array_text[i] = NULL;
if(strstr(word, "sec") != NULL){
int sec;
if (sscanf(word, "%dsec", &sec) == 1){
seconds += sec;
flag = 1;
}
}
}
if(flag){
minutes = seconds / 60;
seconds = seconds % 60;
hours = minutes / 60;
minutes = minutes % 60;
printf("%02d:%02d:%02d\n", hours, minutes, seconds);
}
}
}
В данном случае происходит поиск шаблона в строке и преобразования в строку другого вида, совмещенной с выводом в stdout, Последствия такого вывода таковы, что может быть очень сложно найти всю последовательность функций из которых склеивается строка в потоке вывода (к тому же такое решение не будет работать в многопоточном режиме, но к этому курсу это не относится). Лучше так:
#define TIME_STR_LEN 10
void search_time(char** array_text, int *count_sentence){
for(int i = 0; i < *count_sentence; i++){
int hours = 0;
int minutes = 0;
int seconds = 0;
int flag = 0;
char* word;
while((word = strtok(array_text[i], " ,")) != NULL){
array_text[i] = NULL;
if(strstr(word, "sec") != NULL){
int sec;
if (sscanf(word, "%dsec", &sec) == 1){
seconds += sec;
flag = 1;
}
}
}
char * result_str = NULL;
if(flag){
result_str = malloc(TIME_STR_LEN * sizeof(char));
minutes = seconds / 60;
seconds = seconds % 60;
hours = minutes / 60;
minutes = minutes % 60;
sprintf(result_str, "%02d:%02d:%02d\n", hours, minutes, seconds);
}
return result_str;
}
}
...
char **process_text(char** array_text, int *count_sentences){
/* итерации по предложениями */
char *time_str;
...
time_str = search_time(array_text, i);
/* конкатенация всех подстрок предложения*/
retun result_text;
}
/* в отдельной функции вывода результата циклический обход предложений и вывод строк */
Часто происходит одновременная обработка и вывод результата на экран -- чего нужно избегать