需要帮助将 c-strings 从嵌入式 SQL fetch 复制到单独结构中的另一个 c-string

Posted

技术标签:

【中文标题】需要帮助将 c-strings 从嵌入式 SQL fetch 复制到单独结构中的另一个 c-string【英文标题】:Need help copying c-strings from embedded SQL fetch to another c-string in a separate struct 【发布时间】:2012-10-03 14:58:21 【问题描述】:

我遇到了一个程序,该程序使用嵌入式 SQL 从数据库表中获取行,将行数据存储在一个结构中,然后处理该数据并将结果存储在另一个结构中并推送到链接列表。 fetch数据存放的结构如下:

struct rowstruct 
    char    *first;
    char    *last;
    long    amt;
   client;

我用来存储处理过的数据(并随后作为一个节点推送到我的链表中)的结构是这样的:

struct mystruct 
        char    *firstN;
        char    *lastN;
        long    total;
       data;

我的问题是,每次发生 fetch 循环时,我都需要将 client.first 和 client.last 值复制到 data.firstN 和 data.lastN 中,但我无法让它工作。以下使用赋值运算符,似乎只是在复制指针,而不是值:

data.firstN = client.first;
data.lastN = client.last;

如果我在循环的第一次迭代后输出 data.firstN 和 data.lastN,则值显示正确,但在第二次 fetch 迭代后,我列表中的第一个节点将反映来自第二次 fetch 的值,而不是第一个。

strcpy 将编译,但由于分段错误而在运行时失败,从这里阅读是由于使用了 char*,尽管我认为在使用嵌入获取数据时我不能使用 char[] 或字符串SQL,所以这似乎是一个死胡同。

我确信有办法做到这一点,这对大多数人来说可能很明显,但我不知所措。任何帮助将不胜感激。

谢谢!

【问题讨论】:

你为mystructchar *s分配内存了吗?即data.firstN = malloc (sizeNeeded) - 可能通过strlen - 然后strcpy 注意我更喜欢strncpy 或其他安全的替代方案(strcpy_s?) mystruct 似乎是多余的 很抱歉与 mystruct 混淆。除了上面显示的内容之外,还有更多内容......没有意识到我在帖子中造成的混乱。 @AK4749 - 请参阅下面的评论。我现在知道我做错了什么,建议的解决方案非常简单,尽管您的评论更清楚地说明了我将如何为 char* 分配内存。谢谢 【参考方案1】:

如果代码说要复制指针,那正是发生的情况。

可能你想要的是类似的东西

data.firstN = strdup (client.first);
data.lastN = strdup (client.last);

还有更多类似 C++ 的方法可以做同样的事情,但这应该会让你克服困难。


您不需要重新声明结构。相反,您可以使用

声明data
struct rowstruct data;

【讨论】:

如果您使用strdup 复制字符串,请注意在完成后您必须free。通常这将在 C++ 中使用delete 完成,但这是一个使用malloc 而不是new 分配它的C 函数。 linux.die.net/man/3/strdup @wallyk - 谢谢......我的教授建议的解决方案是将 firstN 和 lastN 声明为 char 数组,例如char firstN[30]。我担心分配不必要的内存(或不够),但由于数据来自预定义的数据库字段,他说可以使用固定的 char 数组大小。我将尝试一下您的建议,但只是为了看看它是如何工作的。至于重新声明结构,mystruct 有其他不属于原始结构的成员。 @Geoff - 感谢您指出其中的内存管理部分。我需要花更多的时间,真正尝试更好地掌握我程序中的所有内容。我对编程很陌生,没有精通或任何单一语言。这个特殊的任务让我使用 C 代码(由于嵌入式 SQL),但我更熟悉 C++,所以我认为我的代码现在有点科学怪人。完成后,也许我可以将其添加到此线程中以进行评论/建议?最好的学习方式似乎是让别人指出问题和更喜欢的方法。

以上是关于需要帮助将 c-strings 从嵌入式 SQL fetch 复制到单独结构中的另一个 c-string的主要内容,如果未能解决你的问题,请参考以下文章

需要一些帮助来创建一个 cmake 文件以使我的项目正常工作...从 cmake 转换

帮助从 SQL Server 读取二进制图像数据到 PHP

C-String 与 C++Strings 的效率

从嵌入式 SQL 迁移到 ODBC 的工具 [关闭]

当我调用不相关的方法时,c-strings 的值会发生变化

c-string用户输入为空时如何发送错误消息?