混合pro * c和OCI时,将varchar数据类型的内容复制到text数据类型的最佳方法是什么。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sqlda.h>
#include <sqlcpr.h>
#include <sql2oci.h>
#include <sqlca.h>
#include <oci.h>
#define UNAME_LEN 30
#define PWD_LEN 30
varchar username[UNAME_LEN];
varchar password[PWD_LEN];
varchar tnsname[32];
int main(int argc, char **argv) {
if ( argc < 3 ) {
printf("\nUsage: %s username \n",argv[0]);
exit(-1);
}
strncpy((char *) username.arr, argv[1], UNAME_LEN);
username.len = (unsigned short) strlen((char *) username.arr);
strncpy((char *) password.arr, argv[2], PWD_LEN);
password.len = (unsigned short) strlen((char *) password.arr);
strncpy((char *)tnsname.arr, argv[3], 20);
tnsname.len = (unsigned short) strlen((char *) tnsname.arr);
text *uname ;
text *pwd ;
text *connstr;
strncpy (uname, username.arr,UNAME_LEN);
strncpy (pwd, password.arr,PWD_LEN);
strncpy (connstr,tnsname.arr,32);
printf ("username is %s \n",uname);
printf ("password is %s \n",pwd);
printf ("connstr is %s \n",connstr);
return 0;
}
我无法使用strncpy复制内容。 当我运行它时,输出是
**username is ger
password is ger
connstr is ger**
虽然我期待输出是scott tiger orcl。
因为我用这些参数运行它。
答案 0 :(得分:0)
我还没有和OCI合作过一段时间,但是当我记得text *
类型只是一个普通的字符指针时。这意味着您尝试将一些文本复制到尚未初始化的指针中。
现在,您正在写入uname
,pwd
和connstr
指向的内存,而不为它们分配内存。这会覆盖那里的所有内存,并且是未定义的行为。
您只是想使用指针,在这种情况下,您可以指向相应的数组,或者将它们声明为数组并复制到它们中。
第一个解决方案:
text *uname = (text *) username.arr;
text *pwd = (text *) password.arr;
text *connstr = (text *) tnsname.arr;
printf ("username is %s \n",uname);
printf ("password is %s \n",pwd);
printf ("connstr is %s \n",connstr);
第二种解决方案:
text uname[UNAME_LEN];
text pwd[PWD_LEN];
text connstr[32];
strncpy (uname, username.arr,UNAME_LEN);
strncpy (pwd, password.arr,PWD_LEN);
strncpy (connstr,tnsname.arr,32);
printf ("username is %s \n",uname);
printf ("password is %s \n",pwd);
printf ("connstr is %s \n",connstr);
对于第二个解决方案,您可以将text
变量保留为指针,并使用malloc
为它们分配内存,但是当您完成时必须free
该内存用它。
我还想提出一个使用strncpy
的问题。如果源字符串长于您复制的长度(即strlen(username.arr) > UNAME_LEN
),则目标字符串不将被终止。您可能需要执行以下操作:
strncpy (uname, username.arr, UNAME_LEN);
uname[UNAME_LEN - 1] = '\0';