fgets 函数行为异常
fgets function behaves oddly
所以我正在编写一个程序,它从用户那里获取 4 个输入:用户名、密码、phone 号码和地址;该程序然后使用 sqlite3
数据库将此数据插入现有的 table.
代码如下:
#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
似乎工作正常。
下面是 table 的样子:
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
,那么条目通常会到达我有 space 的点,因为 scanf
在到达白色时停止 space。但是,我尝试使用 scanf
允许白色 space 的不同格式,我遇到了同样的问题,而且具有相同格式的 scanf 4 次在第三次后停止输入。
想知道我做错了什么。
fgets
函数读取一行文本并将其包括换行符写入给定的字符数组。
在继续处理之前,您需要删除换行符。
fgets(new_user, 200, stdin);
char *nl = strrchr(new_user, '\n');
if (nl) *nl = 0;
所以我正在编写一个程序,它从用户那里获取 4 个输入:用户名、密码、phone 号码和地址;该程序然后使用 sqlite3
数据库将此数据插入现有的 table.
代码如下:
#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
似乎工作正常。
下面是 table 的样子:
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
,那么条目通常会到达我有 space 的点,因为 scanf
在到达白色时停止 space。但是,我尝试使用 scanf
允许白色 space 的不同格式,我遇到了同样的问题,而且具有相同格式的 scanf 4 次在第三次后停止输入。
想知道我做错了什么。
fgets
函数读取一行文本并将其包括换行符写入给定的字符数组。
在继续处理之前,您需要删除换行符。
fgets(new_user, 200, stdin);
char *nl = strrchr(new_user, '\n');
if (nl) *nl = 0;