为什么控制我的PRO * C程序不会转到if部分?

时间:2015-05-22 10:59:53

标签: c oracle oracle-pro-c

我是C和PRO * C的初学者,需要一些帮助。我的结构如下:

typedef struct pt_st{
  char (*s_no)[NULL_BIG_SEQ_NO];
  char (*s)[NULL_STORE];
} pt_st;

pt_st pa_st;

然后我有:

   EXEC SQL DECLARE c_st CURSOR FOR
   SELECT 5 as s, nvl(null, 0) as s_no
   FROM dual;

然后我打开并获取光标如下:

EXEC SQL OPEN c_st;
EXEC SQL FETCH c_st INTO :pa_st.s, :pa_st.s_no;

之后,在我的代码中的某处:

    if (pa_st.s_no[ll_cur_rec] == "0") 
    {
        // do something here, but the control of the program never reaches here!!!  
    }

但是程序的控制永远不会出现if条件。

我怎样才能做到这一点?!

3 个答案:

答案 0 :(得分:1)

编辑:

根据评论更新。

s_no是指向char数组的指针。 (我之前错过了这个)

您正在将指针与" 0"进行比较这是一个指向空终止字符串的指针。 " 0"是一个带有' 0'的字符串。和一个NULL终止符。这里没有警告。但仍然是不正确的比较。

您可能希望取消引用char上的ll_cur_rec指针,看看它是否等于' 0'。

if ((*pa_st.s_no)[ll_cur_rec] == '0')

另外,请检查:Single quotes vs. double quotes in C or C++

答案 1 :(得分:0)

pa_st.s_no[ll_cur_rec]根据你的struct pt_st声明指向一个char变量,当你在if语句中进行比较时,你实际上是在比较一个字符串“0”。字符串“0”实际上是两个字符为'0',后跟'\ 0'为NULL终止符。因此,您的比较应该与char文字一样,

if (pa_st.s_no[ll_cur_rec] == '0') { }

答案 2 :(得分:0)

您的代码有点令人困惑。

首先,您已将ss_no声明为指向char 数组的指针,而不是指向{{{ 1}}。这是你的意图吗?鉴于char5的结果都是整数,为什么不将这些字段声明为整数,例如:

nvl(null,0)

然后你的情况就是

typedef struct pt_st{
   int s_no
   int s;
} pt_st;

如果要存储数据库中的字符串表达式,请将它们声明为if ( pt_st.s_no == 0 ) { ... }

VARCHAR

请注意,VARCHAR foo[ len ]; 有两个字段 - VARCHAR用于存储字符串内容,arr用于存储字符串长度。

您无法使用len运算符比较C中的字符串。您必须使用==strcmp等库函数,例如

strncmp