需要帮助将 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,所以这似乎是一个死胡同。
我确信有办法做到这一点,这对大多数人来说可能很明显,但我不知所措。任何帮助将不胜感激。
谢谢!
【问题讨论】:
你为mystruct
char *
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的主要内容,如果未能解决你的问题,请参考以下文章