Невозможно скопировать меньший массив в больший предварительно заполненный массив в C - PullRequest
0 голосов
/ 29 января 2019

Я пытаюсь скопировать список слов, каждое из которых разделено новой строкой, в новый массив размера 16, значения которого являются шестнадцатеричными версиями символа фунта '#'.Поскольку этих слов может быть меньше 16, конечное значение слова должно быть само словом, а оставшиеся позиции - символом «#», который не заменяется исходным массивом.Код для него выглядит следующим образом:

     fp = fopen("english_words.txt", "r");

        if (fp != NULL) {   
            while ((read = getline(&line, &len, fp)) != -1) {

                if (read < 16) {


                    unsigned char word[16] = {0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23};
//read -1 and not read to ignore the last \n character in line
                    for (int i = 0; i < read - 1; i++) {
                        word[i] = line[i];
                        printf("%x", word[i]);

                    }



                    }
                    printf("\n");   


        }
        fclose(fp);
        if (line)
            free(line);


}

Однако, когда я печатаю окончательный вывод, кажется, что в окончательном массиве для каждого слова вообще не осталось символов фунта.Может ли кто-нибудь помочь с этим?

РЕДАКТИРОВАТЬ:

Пример ввода с файлом, содержащим следующие слова, каждое из которых разделено новой строкой:

abacus
abalone
abandon

Output:
abacus##########
abalone#########
abandon#########

Я собираюсь обработать каждыйиз этих выведенных слов отдельно, поэтому не нужно помещать их в файл.

1 Ответ

0 голосов
/ 29 января 2019
                for (int i = 0; i < read - 1; i++) {
                    word[i] = line[i];
                    printf("%x", word[i]);

                }

, который печатает только прочитанные символы в гекса, нет причин печатать 23 / '#'

, поэтому, если вы читаете abacus , который печатает 616261637573 и нет 23

предупреждение, если вы печатаете слово в виде строки (% s), оно не содержит нулевого символа в конце


Простой способ сделать то, что выожидается, что:

fp = fopen("english_words.txt", "r");
if (fp != NULL) {   
  char w[16];

  while (fscanf(stdin, "%15s", w) == 1)
    printf("%s%s\n", w, "###############" + strlen(w));
}
fclose(fp);

scanf читает до первых 15 символов слова, и я проверяю, что он хорошо читает, сравнивая результат с 1

Форма "###############" + strlen(w) - это простой способ получить строку '#', длина которой равна 15 - длина прочитанного слова

Выполнение:

abacus
abacus##########
abalone
abalone#########
abandon
abandon#########
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...