Копирование части строки в новую строку символ за символом в C - PullRequest
0 голосов
/ 26 октября 2019

Привет У меня есть строка, которая была инициализирована как:

char *line = malloc(100);

Затем я использовал функцию fgets, чтобы прочитать строку из файла в line

Оттуда ясделал еще одну строку, которая была инициализирована как

char *word = malloc(100);

Моя цель - прочитать первое слово из line символ за символом и вставить эти символы в word, до тех пор, пока в line не будет пробела.

Это то, что я пытался.

while(*line != 32){
        *line = *word;
        line++;
        word++;
    }

*word = '\0';
printf("%s\n", word);

По какой-то причине, когда я печатаю значение word впоследствии, печатаются только пробелы. Это значит, что я потерпел неудачу. Тем не менее, я могу печатать *line символ за символом и иметь ожидаемое значение. Почему?

Ответы [ 2 ]

1 голос
/ 26 октября 2019

Для начала вы меняете значение line вместо word. Просто быстрый глазной тест показывает, что вы, вероятно, должны обновить свой код до *word = *line;

1 голос
/ 26 октября 2019

В вашем коде вы модифицируете line и word. Когда вы делаете word++, вы перемещаете указатель на один символ вперед, поэтому в конечном итоге вы печатаете только последний символ word, то есть \0, как вы только что его присвоили.

Чтобы сделать это правильно, самый простой способ - использовать вспомогательные переменные:

char *l, *w;
l = line;
w = word;

while(*l != ' ' && *l != '\0') {
    *w = *l;
    l++;
    w++;
}

*w = '\0';
printf("%s\n", word);

Добавленная проверка для *l != '\0' состоит в том, чтобы убедиться, что вы не читаете после конца line в случае, если естьсимвол пробела не найден.

Другой вариант - использовать вспомогательную индексную переменную для доступа к двум строкам, таким как массивы, вместо использования других указателей:

size_t i;

for (i = 0; line[i] != ' ' && line[i] != '\0'; i++) {
    word[i] = line[i];
}

word[i] = '\0';
printf("%s\n", word);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...