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 строк. Лучше сделать это гибким.