как записать токенизированную строку

Я новичок в C, и все примеры моей проблемы, которые я нашел, не работали, или я совершенно неправильно понял, что это за решение. У меня есть большой файл с данными, который выглядит так:

LYS 24L HB2 45,212 39,585 124,457 SC0 0,145 -0,795 0,585 0,157

на каждой строке. Я токенизировал данные уже с помощью strtok. Что мне нужно, так это второе поле, я хочу, чтобы 24 сохранялись как целое число для сравнения, а L также сохранялось как char для сравнения.

я пытался использовать

sscanf(token[1], "%d%s", number, letter);

но я продолжаю получать ошибку ошибки сегментации. Также после дальнейших экспериментов с sscanf я попытался просто распечатать «LYS» (в попытке глубже понять мою проблему), однако моя программа печатала только L, используя следующую команду:

sscanf(token[0], "%c", &stemp);
letter = stemp;
printf("%c \n", letter);

Однако, если изменить %c ---> %s (надеясь получить всю строку), я снова получаю ошибку Segmentation fault... Что-то я не понимаю в команде sscanf? Почему я не могу прочитать всю строку?? Заранее спасибо за ваше время и помощь!!

Павел


person Paul Kovacs    schedule 09.07.2012    source источник
comment
можете ли вы опубликовать весь сегмент кода, который вы используете для токенизации строки?   -  person Hunter McMillen    schedule 09.07.2012
comment
включить дампы ядра '$ ulimit -c неограниченно'. затем запустите gdb, чтобы проверить, где именно возникает ошибка сегментации. я подозреваю, что это в токене [1]. token[1] кажется ошибочной ссылкой. но, не видя, как токен выделяется и инициализируется, трудно быть уверенным. пожалуйста, включите коды, которые выделили и инициализировали массив токенов.   -  person Aftnix    schedule 09.07.2012


Ответы (1)


Я подозреваю, что проблема в том, что number и letter имеют тип int и char соответственно. scanf() нужны адреса ячеек памяти для хранения значений, а не самих переменных; то есть,

int number;
char letter[2];

sscanf(token[1], "%d%s", &number, letter);

Я превратил letter в массив из двух символов и передаю адрес массива; который соответствует преобразованию сканирования %s, которое вы использовали.

person Ernest Friedman-Hill    schedule 09.07.2012
comment
Спасибо Спасибо! это сработало! однако я все еще не уверен в основной механике этого, зачем мне массив размером 2, содержащий 1 букву?? это потому, что ему нужен символ конца строки или что-то в этом роде?? - person Paul Kovacs; 09.07.2012
comment
Преобразование сканирования '%s' предназначено для строки; строки в C имеют нулевой байт для обозначения конца. Вам всегда нужно учитывать этот дополнительный char при работе со строками в C. Но если вы укажете %c вместо %s, тогда scanf() будет читать только один символ, и вам нужно будет только объявить char, а не массив, и передать адрес этого char (т. е. &letter). - person Ernest Friedman-Hill; 10.07.2012