我正在尝试编写一个函数(并且严重失败!!),它将int作为参数传递并返回从mysql查询生成的字符串 - 请参阅下面的代码:
我希望我的工作能够传递一些参数(1个int和2个字符)并返回3个字符串,我想这些将需要一个结构和指针,但我会从简单的东西..先爬......后来运行:)。
以下是我编写的代码我删除了该函数,但它在编译时失败了
retString = strFunction(Value);
错误:
warning: assignment makes pointer from integer without a cast [enabled by default]
如果需要,我可以发布完整的代码..
非常感谢提前。
int main(int argc, char *argv[])
{
char *retString;
retString = strFunction(Value);
printf("The Return string is: %s", retString);
Exit (0);
}
char *strFunction(int Value)
{
perform code here using value;
Return retString;
}
好的,这是完整的代码..凌乱我知道......尴尬让我最好发帖...
int main(int argc, char *argv[])
{
int Exhibit = 1;
char *rtn_Exhibition;
rtn_Exhibition = rtn_ex(Exhibit);
printf("The Exhibition is set to: %s", rtn_Exhibition);
}
char *rtn_ex(int Exhibit)
{
static char selectEx[2];
unsigned int i;
char selectEx_rtn[20];
memset(selectEx, 0, sizeof(selectEx));
sprintf(selectEx, "SELECT exhibition_description FROM exhibitions WHERE exhibition_id='%d'",Exhibit);
printf("\nThe SELECT statement you have built is: %s\n", selectEx );
connectDB();
if (mysql_query (conn, selectEx) != 0)
{
print_error (conn, "mysql_query() failed");
}
else
{
res_set = mysql_store_result (conn); /* generate result set */
// printf("The value of the result set is: %d\n", res_set);
if (res_set == NULL)
{
print_error(conn, "mysql_store_result() failed");
}
else
{
//process_result_set(conn, res_set);
MYSQL_ROW row;
while ((row = mysql_fetch_row (res_set)) != NULL)
{
for (i = 0; i < mysql_num_fields (res_set); i++)
{
sprintf(selectEx_rtn, "The exhibition name is: %s", (row[i]));
}
}
}
mysql_free_result(res_set);
}
disconnectDB();
return selectEx_rtn;
}
您好T感谢您的回复,回答您的意见:
1)这是正确的,我没有发现。是的,SELECT语句有70个字符+单引号中的int是1到9的数字。我已经将数组调整为80个字符
2)MYSQL_RES指针在程序中先前设置:
MYSQL_RES * res_set;
3)我将此调整为30个字符,但是我收到一条错误,指出selectEX_rtn warning:function返回局部变量的地址。我将selectEx_rtn更改为指针并且函数正常工作但之后直接死于分段错误
答案 0 :(得分:0)
这里有很多错误。
您将static char selectEx[2];
声明为宽度为两个字符的字符数组,稍后您尝试执行此操作:sprintf(selectEx, "SELECT exhibition_description FROM exhibitions WHERE exhibition_id='%d'",Exhibit);
。这将导致缓冲区溢出。对于查询的静态部分,您需要70个字符。假设您使用的是32位整数,则需要另外10个字符以确保您可以保留最长的字符。从这里你应该声明selectEX至少80个字符宽。 建议:将 selectEX 的大小设置为至少80个字符宽(并仔细检查我对所需字符数的计算)。
在这行代码res_set = mysql_store_result (conn);
中,您使用 res_set 而未声明它。编译器可能假设 res_set 是一个int,并且看起来mysql_store_result
正在返回一个指针。这可能是您的错误的来源。 建议:正确声明 res_set 。
在这行代码sprintf(selectEx_rtn, "The exhibition name is: %s", (row[i]));
中,您已声明 selectEX 为二十个字符宽的数组(char selectEx_rtn[20];
)。然而静态部分即&#34;展览名称是:&#34;需要24个字符。这里有另一个缓冲区溢出,这不计算row[i]
中的字符数。 建议:将 selectEx 的声明更改为足以容纳数据。此外,使用带有%s的宽度说明符,即%15s可能会有所帮助。
希望这有帮助, T