функция fgets ведет себя странно - PullRequest
0 голосов
/ 10 января 2020

Итак, я пишу программу, которая принимает от пользователя 4 входа: имя пользователя, пароль, номер телефона и адрес; Затем программа использует базу данных sqlite3 для вставки этих данных в существующую таблицу.

Вот код:

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


void newregister()
{
char new_user[200];
char new_pass[200];
char new_phone[200];
char new_address[200];
printf("Enter your desired username: \n");
fgets(new_user, 200, stdin);
printf("Enter your desired password: \n");
fgets(new_pass, 200, stdin);
printf("Enter your phone number: \n");
fgets(new_phone, 200, stdin);
printf("Enter your address: \n");
fgets(new_address, 200, stdin);

printf("new user = %s \n", new_user);
printf("new pass = %s \n", new_pass);
printf("new phone = %s \n", new_phone);
printf("new address = %s \n", new_address);
sqlite3 *db;
sqlite3_stmt *stmt;
int rc = sqlite3_open("test.db", &db);
if(rc != SQLITE_OK)
{
    fprintf(stderr, "Problem opening Database: %s\n", sqlite3_errmsg(db));
}
char *sql = "INSERT INTO Users VALUES(?, ?, ?, ?, NULL, 0);";
rc = sqlite3_prepare_v2(db, sql, -1, &stmt, 0);
if (rc != SQLITE_OK) 
{
        fprintf(stderr, "Problem executing INSERT: %s\n", sqlite3_errmsg(db));
}
else
{
    sqlite3_bind_text(stmt, 1, new_user, -1, SQLITE_STATIC);
    sqlite3_bind_text(stmt, 2, new_pass, -1, SQLITE_STATIC);
    sqlite3_bind_text(stmt, 3, new_phone, -1, SQLITE_STATIC);
    sqlite3_bind_text(stmt, 4, new_address, -1, SQLITE_STATIC);
}

int step = sqlite3_step(stmt);
sqlite3_finalize(stmt);
sqlite3_close(db);
}
int main()
{
newregister();

return 0;
}

Проблема, с которой я сталкиваюсь, заключается в том, что она не вставляет строки правильно, хотя printf, кажется, работает нормально.

Вот как выглядит таблица:

User        Password    Phone       Address               Cart        Total_Price
----------  ----------  ----------  --------------------  ----------  -----------
user1       pass1       1234567890  Str user nr 1                       0          
user2       pass2       1234586970  Str user nr 2                       0          
user3       pass3       2138321321  Str user nr 3                       0          
user4       pass4       8908702131  Str user nr 4                       0          
user5       pass5       9082313123  Str user nr 5                       0          
user6       pass6       9083213123  Str user nr 6                       0          
user7       pass7       0932382383  Str user nr 7                       0          
user8       pass8       3829832323  Str user nr 8                       0          
user11
 pass11
 1234567890  strada broscautilor
          0          

Если бы я использовал scanf, тогда записи обычно go до точки, где у меня есть пробел, потому что scanf останавливается, когда он достигает пробела. Однако я попытался использовать scanf с другим форматированием, которое допускает пробелы, и у меня та же проблема, а также тот факт, что scanf с тем же форматированием 4 раза перестает принимать ввод после третьего раза. Хотелось бы узнать, что я делаю не так.

1 Ответ

1 голос
/ 10 января 2020

Функция fgets читает строку текста и записывает ее , включая символ новой строки , в заданный массив символов.

Вам необходимо удалить новую строку перед продолжением обработки .

fgets(new_user, 200, stdin);
char *nl = strrchr(new_user, '\n');
if (nl) *nl = 0;
...