2013-05-02 154 views
1

我正在使用mysql.h库的C程序。这是代码:mysql_real_escape_string()导致段错误

int newproduct(){ 
    char *name;//nombre del prducto 
    char *desc;//descripcion del producto 
    double price;//precio del producto 
    cprint("Agregar nuevo producto\n\n"); 
    printf("Nombre del producto: "); 
    scanf("%s", &name); 
    printf("Descripcion: "); 
    scanf("%s", &desc); 
    printf("Precio: "); 
    scanf("%e", &price); 

    MYSQL *conn; 
    conn = mysql_init(NULL); 

    if (!mysql_real_connect(conn, server, 
    user, password, database, port, NULL, 0)) { 
     fprintf(stderr, "%s\n", mysql_error(conn)); 
     exit(1); 
    } 

    char *rname = NULL;//string donde guardar el nombre con caracteres de escape 
    char *rdesc = NULL; 
    mysql_real_escape_string(conn,rname,name,strlen(name));//se realiza el real escape 
    mysql_real_escape_string(conn,rdesc,desc,strlen(desc)); 
    /* 
    char *query;//donde guardar el query 

    snprintf(query,1000,"INSERT INTO productos (nombre,descripcion,stock,precio) VALUES(%s,%s, 0, %e)",rname,rdesc,price);//query a enviar 

    if (mysql_query(conn, query)) {//enviar el query 
     fprintf(stderr, "%s\n", mysql_error(conn)); 
     exit(1); 
    }*/ 

    mysql_close(conn); 

return 0; 
} 

这是控制台执行

Agregar nuevo producto 

Nombre del producto: a 
Descripcion: a 
Precio: 1 
Segmentation fault (core dumped) 


------------------ 
(program exited with code: 139) 
Press return to continue 

我敢肯定的是,mysql_real_escape_string引起分段错误,因为当我评论它的代码工作正常,但它是我的第一次与MySQL一起工作,我不知道为什么这是失败的。除此之外,我能够从数据库检索一些信息,所以它不是连接错误。 PD:cprint是一个声明函数,它向包含mysql行数据的printf函数添加一个头文件。

回答

2

rnamerdesc都应该是缓冲区,而不是指向NULL。您必须先分配内存空间。

例如:

char rname[1024]; 
char rdesc[1024]; 
mysql_real_escape_string(conn, rname, name, 1024); 
mysql_real_escape_string(conn, rdesc, desc, 1024); 

而且,rname的大小不能strlen(name),因为转义字符将需要额外的空间。所需的缓冲区可能不得不比原始字符串大四倍。

+0

缓冲区,根据文档必须是原始字符串的长度加1(对于空终止符)的长度的2倍。这是最坏的情况(也就是说,缓冲区不过是单引号)。 – 2013-06-14 20:29:26

1

docsto说法:

unsigned long mysql_real_escape_string(MYSQL *mysql, char *to, const char *from, unsigned long length) 
                 ^^^^^^^^ 

而你的情况是rnamerdesc需要足够的空间分配给他们。该文件明确说:

You must allocate the to buffer to be at least length*2+1 bytes long. 

您还没有使用scanf正确地namedesc,因为分配给他们既没有空间。像下面的内容将工作:

char name[80]; 
scanf("%s", name); 

如果我们用一个尺寸的80name去然后按照文件,下面会为rname工作:

char rname[161] ;