C语言的小问题,真心搞不定。

大_爱 2012-12-26 07:55:45

#include <stdio.h>
#include <stdlib.h>
#include "sqlite/sqlite3.h"
#include <string.h>

int main(){

printf("mian函数开始\n");
int db_op_result; //数据库操作结果
char SqlStr[256]; //SQL语句
sqlite3 *db; //数据库文件指针
char DBName[40] = "/mnt/nandflash/dm.db"; //数据库文件路径
sqlite3_stmt *stmt; //Statement指针
printf("变量定义\n");
char *card_num_inuse;
char *user_name_result;
char *abcd;
abcd = (char *)malloc(sizeof(char*) * 30);

db_op_result = sqlite3_open(DBName,&db);
if (db_op_result) {
printf("打开数据库失败!! %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return -1;
}

printf("打开数据库成功\n");
sprintf(SqlStr, "select * from cardinfo");
db_op_result = sqlite3_prepare(db,SqlStr,-1,&stmt,0);
if(db_op_result != SQLITE_OK){
printf("SQLerror:%sn",sqlite3_errmsg(db));
}
// db_op_result = sqlite3_step(stmt);
// ncols=sqlite3_column_count(stmt);

printf("循环\n");
while(sqlite3_step(stmt) == SQLITE_ROW){
card_num_inuse = (char *) sqlite3_column_text(stmt, 0);
user_name_result = (char *) sqlite3_column_text(stmt, 1);
abcd = (char *) sqlite3_column_text(stmt,2);
printf("nimei1\n");
printf("%s",card_num_inuse);
printf("nimei2\n");
printf("%s",user_name_result);
printf("nimei3\n");
printf("%s",abcd);//打印这里没问题
printf("%d",strlen(abcd));//这里出现Segmentation fault

// strcpy(tmp,tvcolwm);
// if(strlen(tvcolwm) == 0){
// printf("这是空字符串啦,有问题的\n");
// }
printf("\n");
}
printf("%d\n",strlen(abcd));
//释放statement
sqlite3_finalize(stmt);
//关闭数据库
sqlite3_close(db);

printf("程序执行完毕\n");
free(abcd);
return 0;
}



这是用C语言操作sqlite(一种小型的数据库)数据库前两个字段是有值的,后面的一个字段为空,我想判断是否为空结果一直报Segmentation fault 也不知道哪里有问题。也没有sqlite这个论坛就放在C语言中了。麻烦大家帮帮忙,还没下班。
...全文
427 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
大_爱 2012-12-27
  • 打赏
  • 举报
回复
引用 19 楼 gumh 的回复:
再了解一下这个函数,有用。 sqlite3_column_bytes16()
多谢,编写C/C++程序比较蛋疼
prajna 2012-12-27
  • 打赏
  • 举报
回复
再了解一下这个函数,有用。 sqlite3_column_bytes16()
大_爱 2012-12-27
  • 打赏
  • 举报
回复
引用 15 楼 swordtan 的回复:
引用 14 楼 beefcattlexiaoyang 的回复:引用 12 楼 swordtan 的回复:判断一下abcd是否为NULL 是啊,我就是想判断一下它是不是空,我用C的函数对它操作,就说Segmentation fault。不管是strlen还是strcmp都报这个,没辙了。 这么判断一下 if(abcd != NULL)
感谢!!!终于搞定了,应该这样判断 abcd == NULL 再次感谢,结贴了。
大_爱 2012-12-27
  • 打赏
  • 举报
回复
引用 16 楼 gumh 的回复:
你要不用这个函数看看, sqlite3_column_text16() 用来获取utf-16编码的文本。
第二个字段是中文,读取出来显示是正常的,只是我复制出来的时候有问题。
prajna 2012-12-27
  • 打赏
  • 举报
回复
你要不用这个函数看看, sqlite3_column_text16() 用来获取utf-16编码的文本。
swordtan 2012-12-27
  • 打赏
  • 举报
回复
引用 14 楼 beefcattlexiaoyang 的回复:
引用 12 楼 swordtan 的回复:判断一下abcd是否为NULL 是啊,我就是想判断一下它是不是空,我用C的函数对它操作,就说Segmentation fault。不管是strlen还是strcmp都报这个,没辙了。
这么判断一下 if(abcd != NULL)
大_爱 2012-12-27
  • 打赏
  • 举报
回复
引用 12 楼 swordtan 的回复:
判断一下abcd是否为NULL
是啊,我就是想判断一下它是不是空,我用C的函数对它操作,就说Segmentation fault。不管是strlen还是strcmp都报这个,没辙了。
prajna 2012-12-27
  • 打赏
  • 举报
回复
有可能是这个原因,你用utf-8编码试试看。
swordtan 2012-12-27
  • 打赏
  • 举报
回复
判断一下abcd是否为NULL
大_爱 2012-12-27
  • 打赏
  • 举报
回复
引用 10 楼 gumh 的回复:
是不是用了中文?
用了,这个应该没啥关系吧。
prajna 2012-12-27
  • 打赏
  • 举报
回复
是不是用了中文?
大_爱 2012-12-27
  • 打赏
  • 举报
回复
引用 4 楼 zhuankeshumo 的回复:
数据库里的NULL和空字符串是不一样的(谷歌一下数据库中的NULL吧!) 要用ISNULL函数判断 不能用字符串相关函数判断
C中没提供这个函数吧,提供了这个函数我就用了。
大_爱 2012-12-27
  • 打赏
  • 举报
回复
引用 6 楼 gumh 的回复:
不知道你的數據表裏具體數據類型是怎樣的? char *abcd; //abcd = (char *)malloc(sizeof(char*) * 30); //這裡是不需要分配内存 // db_op_result = sqlite3_step(stmt); ncols=sqlite3_column_count(stmt……
本来我也不给他分配内存的,但是老报错,我就给他分配内存了,但是还是报错。没辙了,才上论坛来问问的。
大_爱 2012-12-27
  • 打赏
  • 举报
回复
cardinfo建表语句

CREATE TABLE cardinfo(card_snr char(50) not null,user_name char(50) not null, tvcolumn char(20));
cardinfo数据

sqlite> select * from cardinfo;
0x9e|Τ¾§|
0x6e|ÁÎÒÕ|
0x0e|ÀÍÃù¶¬|
0x5e|Íõΰ¶«|
0x2e|Áú½­Ñà|
0x3e|µËɯɯ|
0x6e|ÑÔ»Ô|
0xfe|·½³É|
0xad|ÑîÓ¨|
0x16|ÁÖÐÂÆ½|
0x0e|³ÂÁÁ|
0x9e|admin|
0x1e|ÕŰ½|
0xce|ÕÔÐÂÓî|
0xbe|ÀîÏþÑà|

一共三个字段,最后一个字段是后面添加的,所以,没有数据,我想读取这个值进行判断。输出是没有问题的,但是用函数如strlen()都会报错。
prajna 2012-12-26
  • 打赏
  • 举报
回复
不知道你的數據表裏具體數據類型是怎樣的? char *abcd; //abcd = (char *)malloc(sizeof(char*) * 30); //這裡是不需要分配内存 // db_op_result = sqlite3_step(stmt); ncols=sqlite3_column_count(stmt); 建議你將上面這句打開,debug 看看到底有幾個字段。 printf("循环\n"); while(sqlite3_step(stmt) == SQLITE_ROW){ card_num_inuse = (char *) sqlite3_column_text(stmt, 0); user_name_result = (char *) sqlite3_column_text(stmt, 1); abcd = (char *) sqlite3_column_text(stmt,2); printf("nimei1\n"); printf("%s",card_num_inuse); printf("nimei2\n"); printf("%s",user_name_result); printf("nimei3\n"); printf("%s",abcd);//打印这里没问题 printf("%d",strlen(abcd));//这里出现Segmentation fault // strcpy(tmp,tvcolwm); // if(strlen(tvcolwm) == 0){ // printf("这是空字符串啦,有问题的\n"); // } printf("\n"); } 沒這個dm.db文件,沒法debug給你找原因。
newtee 2012-12-26
  • 打赏
  • 举报
回复
NULL是一个重要的知识点
newtee 2012-12-26
  • 打赏
  • 举报
回复
数据库里的NULL和空字符串是不一样的(谷歌一下数据库中的NULL吧!) 要用ISNULL函数判断 不能用字符串相关函数判断
hznat 2012-12-26
  • 打赏
  • 举报
回复
楼主发下cardinfo的表结构及里面的测试数据。
大_爱 2012-12-26
  • 打赏
  • 举报
回复
唉,只有等到明天了。
大_爱 2012-12-26
  • 打赏
  • 举报
回复
在线等待。。。实在没法了。

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧