2012-02-28 23 views
0

混合pro * c和OCI時,將varchar數據類型的內容複製到文本數據類型的最佳方法是什麼?將varchar複製到文本數據類型

#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** 

而我期待輸出爲斯科特老虎ORCL。

因爲我用這些參數運行它。

+0

你是否在'EXEC SQL BEGIN DECLARE SECTION'塊中放置了'username'聲明?就像現在一樣,您聲明瞭一個'UNAME_LEN' varchar數組。 – 2012-02-28 07:13:25

+0

我注意到EXEC SQL BEGIN DECLARE SECTION並不是必需的,因爲它沒有這個問題。問題是當試圖將用戶名複製到uname – 2012-02-28 07:16:20

+0

那麼你必須提供更多關於你的問題的細節......運行時崩潰?編譯器錯誤?鏈接器錯誤?請編輯您的問題以儘可能詳細地添加。 – 2012-02-28 07:21:09

回答

0

我有一段時間沒有與OCI合作過,但我記得text *類型只是一個普通的字符指針。這意味着您嘗試將一些文本複製到尚未初始化的指針中。

現在,您正在寫入uname,pwdconnstr所指向的內存,而無需爲它們分配內存。這將覆蓋開始的任何內存,並且是未定義的行爲。

要麼你只是想使用指針,在這種情況下,你可以讓它們指向相應的數組,或者將它們聲明爲數組並將其複製到它們中。

第一個解決方案:

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

Joachim多虧了我第一個解決方案,因爲我更喜歡它,因爲我需要使用字符指針。 – 2012-02-28 08:48:33

相關問題