strtok() добавляет некоторый символ в мою строку
Я использую strtok() для анализа строки, которую я получаю от fgets(), которая отделена символом ~
например, data_1~data_2
Вот пример моего кода:
fgets(buff, LINELEN, stdin);
pch = strtok(buff, " ~\n");
//do stuff
pch = strtok(NULL, " ~\n");
//do stuff
Первый экземпляр strtok прекрасно разбивает его, я получаю data_1 как есть, и strlen(data_1) предоставляет правильную длину. Тем не менее, второй экземпляр strtok возвращает строку с добавлением чего-либо к ней.
С вводом andrewjohn ~ jamessmith
Я распечатал каждый символ и индекс, и я получил этот вывод:
a0
n1
d2
r3
e4
w5
j6
o7
h8
n9
j0
a1
m2
e3
s4
s5
m6
i7
t8
h9
10
Какое это "11-е" значение соответствует?
РЕДАКТИРОВАТЬ:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char buff[100];
char * pch;
fgets(buff, 100, stdin);
pch = strtok(buff, " ~\n");
printf("FIRST NAME\n");
for(i = 0; i < strlen(pch); i++)
{
printf("%c %d %d\n", *(pch+i), *(pch+i), i);
}
printf("SECOND NAME\n");
pch = strtok(NULL, " ~\n");
for(i = 0; i < strlen(pch); i++)
{
printf("%c %d %d\n", *(pch+i), *(pch+i), i);
}
}
Я управлял им:
cat sample.in | ./myfile
Где образец. В
andrewjohn ~ johnsmith
Выход был:
FIRST NAME
a 97 0
n 110 1
d 100 2
r 114 3
e 101 4
w 119 5
j 106 6
o 111 7
h 104 8
n 110 9
SECOND NAME
j 106 0
o 111 1
h 104 2
n 110 3
s 115 4
m 109 5
i 105 6
t 116 7
h 104 8
13 9
Таким образом, последний символ - это значение ASCII 13, которое говорит, что это возврат каретки ('\r'). Почему это подходит?
1 ответ
Исходя из ваших правок, строка ввода заканчивается \r\n
, В качестве обходного пути вы можете просто добавить \r
к вашему списку токенов в strtok.
Тем не менее, это должно быть расследовано дальше. \r\n
строка заканчивается в файле Windows, но stdin
текстовый поток, так \r\n
в файле будет преобразован в просто \n
в fgets
результат.
Возможно, вы пишете в файл, который содержит что-то странное, как \r\r\n
? Попробуйте выполнить шестнадцатеричный дамп файла, который вы отправляете, чтобы проверить это.
Другим возможным объяснением может быть то, что ваша среда Cygwin (или любая другая) была каким-то образом сконфигурирована так, чтобы не переводить окончания строк в передаваемом файле.
редактировать: предложение Иоахима гораздо более вероятно - используя \r\n
файл в системе, отличной от Windows. Если это так, вы можете исправить это, запустив dos2unix
в файле. Но в соответствии с принципом "примите все, сгенерируйте правильно" было бы полезно, чтобы ваша программа обработала этот файл.