Я получаю нежелательный символ, который будет выведен в самом конце текста, который я прочитал:
hum 1345342342 ~Users/Documents ecabd459 //line that was read in from stdin
event action: hum_?
event timestamp: 1345342342
event path: ~Users/Documents
event hash: ecabd459
В конце значения действия события есть '_?'символ мусора, который также выводится.Это можно исправить, установив в последней позиции переменной нулевой терминатор (event.action[3] = '\0'
), что все хорошо, но я озадачен тем фактом, что другой массив символов event.hash
не демонстрирует такого типа поведения.Я создаю / печатаю их идентичным образом, но хэш не ведет себя одинаково.
Примечание: Я подумывал, может быть, это связано с тем, что за значением хеша строго следует символ новой строки (от которого я, кстати, избавляюсь), поэтому я протестировал свою программу с помощью reупорядоченный ввод безрезультатно (то есть добавлен дополнительный пробел и слово после позиции хеш-значения в строке).
Соответствующий код приведен ниже:
struct Event{
char action[4];
long timestamp;
char* path;
char hash[9];
};
// parse line and return an Event struct
struct Event parseLineIntoEvent(char* line) {
struct Event event;
char* lineSegment;
int i = 0;
lineSegment = strtok(line, " ");
while (lineSegment != NULL) {
if (i > 3) {
printf("WARNING: input format error!\n");
break;
}
if (i == 0)
strncpy(event.action, lineSegment, sizeof(event.action)-1);
else if(i == 1)
event.timestamp = atoi(lineSegment);
else if(i == 2) {
event.path = malloc(sizeof(lineSegment));
strcpy(event.path, lineSegment);
} else if(i == 3)
strncpy(event.hash, lineSegment, sizeof(event.hash)-1);
lineSegment = strtok(NULL, " ");
i++;
} // while
return event;
} // parseLineIntoEvent()
int main (int argc, const char * argv[]) {
//...
printf("%s\n",line); //prints original line that was read in from stdin
struct Event event = parseLineIntoEvent(line);
printf("event action: %s\n", event.action);
printf("event timestamp: %lu\n", event.timestamp);
printf("event path: %s\n", event.path);
printf("event hash: %s\n", event.hash);
free(event.path);
free(line);
//...
return 0;
}
РЕДАКТИРОВАТЬ: Я прочитал в строке с этой функцией, которая избавляет от символа новой строки:
// read in line from stdin, eliminating newline character if present
char* getLineFromStdin() {
char *text;
int textSize = 50*sizeof(char);
text = malloc(textSize);
if ( fgets(text, textSize, stdin) != NULL ) {
char *newline = strchr(text, '\n'); // search for newline character
if ( newline != NULL ) {
*newline = '\0'; // overwrite trailing newline
}
}
return text;
}
Заранее спасибо!