Строка не отображается при удалении новой строки - PullRequest
0 голосов
/ 15 марта 2019

Поэтому я использую fgets, чтобы получить строки из файла, а затем добавить их в массив. Но прежде чем добавить их в массив, я хочу удалить символ "\ n". Это то, что я использовал для этого

strtok(str,"\n");
array[i] = strdup(str);

массив инициализируется в char * array [32];

Теперь функции работают отлично, я могу использовать массив и его элементы так, как я этого не хотел. Однако всякий раз, когда я пытаюсь напечатать элементы, они не работают должным образом.

например, если array[i] = hello

printf("%s:TEST",array[i]);

напечатает

:TEST

но

printf("%s\n:TEST",array[i]);

напечатает

hello
:TEST

Мне нужно, чтобы он был на одной строке, поэтому я не могу использовать \ n, и просто странно, как он будет печататься, только если после него будет новая строка.

Редактировать: не strdup (штрих), а strdup (str)

Edit: Полный пример кода:

char *array[32]
char holder[32]


FILE *fp = fopen("file.txt","r");

int i = 0;

while(fgets(holder, 100, fp)){
    strtok(holder,"\n");
    array[i] = strdup(holder);
    i++;

}
fclose(fp);

printf("word: %s",words[1]);

array [i] не будет печататься, если после него не будет '\ n', как упоминалось выше

Редактировать: добавлена ​​функция печати текстовый файл в формате

string1
string2
string3

Ответы [ 2 ]

0 голосов
/ 26 марта 2019

У вас есть несколько проблем во фрагменте кода:

  • array не инициализировано в char *array[32], оно просто определено таким образом и неинициализированоесли это определение происходит внутри тела функции.Кстати, ; отсутствуют в определениях во фрагменте кода.

  • размер holder равен 32, но вы передаете 100 в fgets(), вызываяпотенциальное переполнение буфера.

  • printf("%s:TEST",array[i]); отсутствует в вашем коде, вы не опубликовали код, нарушающий работу.
  • окончательный вывод, printf("word: %s",words[1]); использует неопределенный объект words, а индекс 1 может быть вне диапазона, если вы вводите только одно слово.

Вы должны опубликовать реальную программу с оскорбительным поведением.Фрагмент кода не соответствует описанному вами поведению.

0 голосов
/ 15 марта 2019

Функция библиотеки C char * strtok (char * str, const char * delim) разбивает строку str на серию токенов, используя разделитель-разделитель.Так что это не функция, которая обрабатывает строку как ссылку, а как значение.Поэтому, когда вы делаете что-то вроде:

strtok(str, "\n");

str будет иметь то же значение, что и раньше.Если вам нужен первый токен, например, значение str, пока он не найдет «\ n» в первый раз, вы должны сделать что-то вроде.

array[i] = strtok(str, "\n");

или

char *token = strtok(str, "\n");
array[i] = strdup(token);

или что-нибудь в этом роде.

КОД:

#include <string.h>
#include <stdio.h>

int main () {
  char buff[100];
  char *array[32];

  FILE *fp = fopen("file.txt","r");

  int i = 0;
  while(fgets(buff, 100, fp)){
    char* token = strtok(buff,"\n");
    array[i] = strdup(token);
    printf("%s:TEST\n", array[i]);
    i++;
  }

  fclose(fp);
  return(0);
}

file.txt

HELLO
BYE

Вывод:

HELLO:TEST
BYE:TEST
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...