我是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条件。
我怎样才能使它工作?!
EDIT:
根据注释更新。
s_no
是指向char
数组的指针。(我之前错过了这个)
您正在将指针与指向空结束字符串的指针"0"进行比较。"0"是一个带有'0'和NULL结束符的字符串。这里没有警告。但这是不正确的比较。
您可能想要在ll_cur_rec
处解引用char
指针,看看它是否等于'0'。
if ((*pa_st.s_no)[ll_cur_rec] == '0')
还有,检查一下:C或c++中的单引号和双引号
pa_st.s_no[ll_cur_rec]
指向一个char变量,根据您的结构体pt_st声明,当涉及到您在if
语句中的比较时,您实际上是在与字符串"0"进行比较。字符串"0"实际上是两个字符'0'后面跟着' '一个NULL结束符。因此,您的比较应该使用字符字面值,如
if (pa_st.s_no[ll_cur_rec] == '0') { }
你的代码有点混乱。
首先,您已经将s
和s_no
声明为指向char
数组的指针,而不是指向char
的指针数组。这是你想要的吗?既然5
和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
这样的库函数,例如
if ( strcmp( str, "0" ) == 0 ) // str is equal to the string "0"
{
...
}