为什么我的 PRO*C 程序的控制权没有转到 if 部分?
Why the control of my PRO*C program doesn't go to the if section?
我是 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条件。
我怎样才能使这个工作?!
pa_st.s_no[ll_cur_rec]
根据您的结构 pt_st 声明指向一个 char 变量,当涉及到您在 if
语句中的比较时,您实际上是在与字符串“0”进行比较.字符串“0”实际上是两个字符“0”后跟一个 NULL 终止符“\0”。因此,您的比较应该与 char 文字进行比较,
if (pa_st.s_no[ll_cur_rec] == '0') { }
编辑:
根据评论更新。
s_no
是一个指向char
数组的指针。 (我之前错过了这个)
您正在将指针与“0”进行比较,“0”是指向空终止字符串的指针。 “0”是一个带有“0”和 NULL 终止符的字符串。这里没有警告。但仍然是不正确的比较。
您可能想要取消引用 ll_cur_rec
处的 char
指针并查看它是否等于“0”。
if ((*pa_st.s_no)[ll_cur_rec] == '0')
另外,检查一下:Single quotes vs. double quotes in C or C++
你的代码有点混乱。
首先,您已将 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"
{
...
}
我是 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条件。
我怎样才能使这个工作?!
pa_st.s_no[ll_cur_rec]
根据您的结构 pt_st 声明指向一个 char 变量,当涉及到您在 if
语句中的比较时,您实际上是在与字符串“0”进行比较.字符串“0”实际上是两个字符“0”后跟一个 NULL 终止符“\0”。因此,您的比较应该与 char 文字进行比较,
if (pa_st.s_no[ll_cur_rec] == '0') { }
编辑:
根据评论更新。
s_no
是一个指向char
数组的指针。 (我之前错过了这个)
您正在将指针与“0”进行比较,“0”是指向空终止字符串的指针。 “0”是一个带有“0”和 NULL 终止符的字符串。这里没有警告。但仍然是不正确的比较。
您可能想要取消引用 ll_cur_rec
处的 char
指针并查看它是否等于“0”。
if ((*pa_st.s_no)[ll_cur_rec] == '0')
另外,检查一下:Single quotes vs. double quotes in C or C++
你的代码有点混乱。
首先,您已将 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"
{
...
}