2012-02-28 8 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を使用して内容をコピーできません。 私はこれを実行すると、私は、出力はスコット虎ORCLであることを期待していたのに対し出力に含まが

**username is ger 
password is ger 
connstr is ger** 

です。

私はこれらのパラメータを使って実行しているためです。

+0

'EXEC SQL BEGIN DECLARE SECTION'ブロックに' username'宣言を入れましたか?今のところ、 'UNAME_LEN' varcharの配列を宣言します。 –

+0

EXEC SQL BEGIN DECLARE SECTIONはそれがなくても動作するので必須ではないことに気付きました。ユーザー名をuname –

+0

にコピーしようとすると、問題の詳細がわかります...ランタイムクラッシュ?コンパイラエラー?リンカのエラー?できるだけ詳細を追加するために質問を編集してください。 –

答えて

0

私はしばらくの間OCIで作業していませんでしたが、text *タイプは単なる通常の文字ポインタです。つまり、初期化されていないポインタにテキストをコピーしようとします。

今では、unamepwd、および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'; 
+0

Joachim私は文字ポインタを使用する必要があるので、私は最初の解決策を取りました。 –

関連する問題