По той или иной причине я не могу заставить работать два экземпляра fgets()
и strcat()
.
Это мой код:
#include <stdio.h>
#include <string.h>
int main()
{
char str[150];
char userName[8]; char password[8];
printf("Enter username: ");fgets(userName, 9, stdin);
printf("Enter password: ");scanf("%s", password);
strcpy(str, "INSERT INTO USERS (ID,USERNAME,PASSWORD,IP) " \
"VALUES (1, '");
strcat(str, userName);
strcat(str, "', '");
strcat(str, password);
strcat(str, "', '120.132.12.1');");
puts(str);
return 0;
}
При получении строки для «пароля» я не могу использовать fgets()
или выдает ошибку «Прервать ловушку: 6». В частности, я использую:
fgets(password, 9, stdin);
9 элементов, потому что я читал, что вам нужно учитывать нулевой завершающий символ в вашей сумме.
Я не понимаю этого, потому что, поскольку в массиве char столько же элементов, сколько и в userName, я думал, что код для получения строки должен быть практически таким же, кроме имени массива char.
Кроме того, strcat()
, похоже, не работает при попытке добавить «str» с именем пользователя. Мой вывод выглядит примерно так:
Enter username: beckah12
Enter password: beckah12
INSERT INTO USERS (ID,USERNAME,PASSWORD,IP) VALUES (1, '', 'beckah12', '120.132.12.1')
Почему он пропускает "strcpy(str, userName)"
?
Обновлять
Когда я объявляю эти две строки, происходит некоторое перекрытие памяти. Когда я объявил случайное целое число между двумя строками, он сохранил входные данные для обеих. Как исправить это перекрытие памяти с помощью более постоянного решения?
fgets()
слишком велик. Дляchar[8]
должно быть8
. Кроме того, вы должны ограничить (и проверить) scanf:scanf("%7s", password);
- person pmg   schedule 12.05.2014fgets
, что в вашем буфере 9 символов, хотя в нем всего 8. Максимальное количество считываемых символов включая завершающий нуль. - person Gene   schedule 12.05.2014username
до и после чтения пароля. Или попробуйте пароль из 7 символов. - person Jonathan Leffler   schedule 12.05.2014fgets()
закончилось место для строки данных до того, как она прочитала новую строку; поэтому второйfgets()
читает новую строку и прекращает обработку. Считайте данные в более крупные строки (32, 64, 80, 256, 4096 байт), а затем проверьте длину и т. д. Помните, чтоfgets()
включает новую строку во входную строку, когда она подходит. Когда он не подходит, он остается для следующей операции чтения. Это немного странно — что-то вроде ретро 80-х — ограничивать имя пользователя всего 8 символами, не так ли? - person Jonathan Leffler   schedule 12.05.2014fgets()
будет читать"beckah12\n"
, что равно 9char
и завершающему'\0'
. - person chux - Reinstate Monica   schedule 12.05.2014