Пропущенные символы и плохая печать

#c

#c

Вопрос:

Это мой код

 FILE *fp;
char line[255];
fp = fopen("./games/Dead Space.txt", "r");
// Check if fopen succeeds and those things goes here.

fgets(line, 255, fp);
char name[255];

strcpy(name, strtok(line, "n"));
printf("%s: a gamen", name);
  

Объяснение кода: я пытаюсь получить первую строку ./games/Dead Space.txt и удалить, n если таковые имеются.

Это ./games/Dead Space.txt

 Dead Space
Shooter, 3D
Electronic Arts
  

И это вывод

 : a gamece
  

Ожидаемый результат

 Dead Space: a game
  

Кто-нибудь может мне помочь? Почему это происходит?

Комментарии:

1. Не связано: удалить конечную 'n' строку с data помощью data[strcspn(data, "n")] = 0;

2. Вероятно, вы скопировали файл данных из Windows или с веб-сайта, на котором он был размещен из WIndows, или, возможно, создали с помощью редактора Unixy, который поддерживает режим ‘DOS’ или ‘CRLF’, например vim, и в результате он содержит CR LF окончания строк . Вы удаляете LF, но оставляете CR, поэтому затем вы выводите, например Dead Space<CR>: a game , который отображается на вашем терминале как : a gamece . Проверьте с file помощью утилиты, cat -v , sed -n l (ell) или аналогичной.

3. @dave_thompson_085 да, я на Windows… Как я могу это исправить?

4. Какую реализацию (компилятор, библиотеку и т.д.) Вы используете? Реализация, разработанная для Windows, такая как MSVC , уже должна переводить CRLF в NL в стиле C, хотя некоторые этого не делают по умолчанию: вам может потребоваться указать t (для текста, т.Е. недвоичного) в строке fopen mode . Если вы используете что-то, перенесенное на Windows, например cygwin или WSL, это менее согласованно, хотя проверьте документацию; возможно , вам потребуется удалить или поддержать CR самостоятельно.

5. Это бесплатно: проверьте, успешно ли работает fopen.