fgetc не отображается правильно после пробела

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

    int main() {
      FILE *userfile, *pwfile, *usernamesPasswords, *readUsernamesPasswords;
      char u, p, user[20][25], pass[20][20], userLine[25], passLine[20];
      int i = 0;
      int j = 0;
      int userIndex = 0;
      int passIndex = 0;

      userfile = fopen("usernames.txt", "r");
      pwfile = fopen("passwords.txt", "r");

      if (userfile == NULL || pwfile == NULL) {
        printf("Cannot open file \n");
        exit(0);
      }

      u = fgetc(userfile);
      while (u != EOF) {
        if ( u != '\n'){
          userLine[userIndex++] = u;
        } else {
          userLine[userIndex] = '\0';
          strcpy(user[i], userLine);
          userIndex = 0;
          i++;
        }
        u = fgetc(userfile);
      }
      fclose(userfile);


      p = fgetc(pwfile);
      while (p != EOF) {
        if ( p != '\n'){
           passLine[passIndex++] = p;
        } else {
            passLine[passIndex] = '\0';
            strcpy(pass[j], passLine);
            passIndex = 0;
            j++;
        }
        p = fgetc(pwfile);
      }
      fclose(pwfile);

      usernamesPasswords = fopen("usernamesPasswords.txt", "w");
      int w, k;
      char newLine[1024];
      for (w=0;w<20;w++) {
        strcat(newLine, user[w]);

        int q = strlen(newLine);
        for (k=0;k<(25-q);k++) {
          strcat(newLine, " ");
        }

        strcat(newLine, pass[w]);
        strcat(newLine, "\n");
        strcat(newLine, "\0");
        fputs(newLine ,usernamesPasswords);
        strcpy(newLine, "");
      }
      fclose(usernamesPasswords);

      printf("\nDo you want to display the new file? Enter (y) to view and any other key to exit\n");
      char word;
      scanf("%c",&word);

      if (word == 'y') {
        readUsernamesPasswords = fopen("usernamesPasswords.txt", "r");
        if (readUsernamesPasswords == NULL) {
          printf("Cannot open file \n");
          exit(0);
        }

        char r;
        while((r=fgetc(readUsernamesPasswords))!=EOF) {
          printf("%c", r);
        }
        fclose(readUsernamesPasswords);
      }

      return 0;
    }

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

Moodie                  123456
Intelllligent           password
Happee                  12345678
Mischeivous             qwerty
SweetKristy             123456789
KristyHoney             12345
BubblySnowflake         1234
AngelicPrincessKristy   111111
FairyPrincessKristy     1234567
BabyKristyButterfly     dragon
daffyusers              123123
magpiedoodle            baseball
aspiringthreat          abc123
landmarksspreader       football
cavaliervanquish        monkey
chatteringparma         letmein
veggiehydrogen          696969
teethunsure             shadow
rumpboast               master
lidarstrudel            666666

Вместо...

                  123456
           password
                  12345678
             qwerty
             123456789
             12345
         1234ke
   111111incessKristy
     1234567sKristy
     dragonutterfly
              123123
            baseball
          abc123
       footballer
        monkeysh
         letmein
          696969
             shadow
               master
            666666

Это происходит только тогда, когда я пытаюсь вывести на терминал. Фактический файл usernamesPasswords.txt выходит как положено. Кажется, что левая сторона строк печатается только тогда, когда я начинаю новую строку вместо пробелов...

Я даже пробовал fgets и fread, но схожий вывод. Я читал другие посты о еде или потреблении, поэтому я попытался использовать fgets или fread, как предлагалось, и даже попытался unget. не похоже на работу. Я искал все переполнение стека безрезультатно.

Если это дубликат, прошу прощения заранее. Я действительно пытался просмотреть всю сеть в течение пары часов, прежде чем принять решение о публикации.

Я обычно не пишу, потому что переполнение стека обычно уже есть все...

Пожалуйста помоги! Спасибо!

2 ответа

Вы не можете позвонить strcat или же strlen на неинициализированном хранилище. Это неопределенное поведение. Строковые функции обычно требуют, чтобы входные строковые аргументы были правильно завершены NUL. (Без терминатора невозможно определить, где заканчивается строка.)

А также strcat(s, "\0") не используется, потому что второй аргумент фактически является пустой строкой (нулевой длины). (И, как указано выше, если s еще не завершено NUL, это неопределенное поведение.)

В вашей программе эта часть кода имеет несколько проблем:

  char newLine[1024];
  for (w=0;w<20;w++) {
    strcat(newLine, user[w]);

    int q = strlen(newLine);
    for (k=0;k<(25-q);k++) {
      strcat(newLine, " ");
    }

    strcat(newLine, pass[w]);
    strcat(newLine, "\n");
    strcat(newLine, "\0");
    fputs(newLine ,usernamesPasswords);
    strcpy(newLine, "");
  }

Проблемы как newLine буфер не инициализируется и не используется в strcat, Конкатенация пустой строки не имеет никакого эффекта - strcat(newLine, "\0");, Вы можете решить эти проблемы, просто инициализируя буфер {0} и вместо конкатенации пустой строки назначьте \0 на соответствующий индекс буфера. Но вам не нужно делать все это strcatвместо этого вы можете просто сделать все это в одну строку, например:

  char newLine[1024];
  for (w=0;w<20;w++) {
    snprintf (newLine, 1024, "%-25s%s\n", user[w], pass[w]);
    fputs(newLine ,usernamesPasswords);
  }

snprintf добавляет завершающий нулевой символ после содержимого, записанного в буфер.

Несколько баллов:
- Вы должны проверить возвращаемое значение fopen,
- тип возврата fgetc является int и не char и вы берете его возвращаемое значение в char тип.
- Вам нужно позаботиться о нескольких вещах в вашей программе, например, если ваша программа работает при условии, что usernames.txt а также passwords.txt содержит точные 20 строк. Лучше сделать это гибким.

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