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 в файле. Но в соответствии с принципом "примите все, сгенерируйте правильно" было бы полезно, чтобы ваша программа обработала этот файл.

Другие вопросы по тегам