将varchar复制到text数据类型

时间:2012-02-28 06:21:29

标签: c oracle

混合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。

因为我用这些参数运行它。

1 个答案:

答案 0 :(得分:0)

我还没有和OCI合作过一段时间,但是当我记得text *类型只是一个普通的字符指针时。这意味着您尝试将一些文本复制到尚未初始化的指针中。

现在,您正在写入unamepwdconnstr指向的内存,而不为它们分配内存。这会覆盖那里的所有内存,并且是未定义的行为。

您只是想使用指针,在这种情况下,您可以指向相应的数组,或者将它们声明为数组并复制到它们中。

第一个解决方案:

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';