未知长度的C字符串定义 [英] C string definition of unknown length

查看:314
本文介绍了未知长度的C字符串定义的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要的数据(previously未知格式/尺寸)存储供以后(要被保存在一个XML文件)处理字符串中

我如何做到这一点?

正如你所看到的,code下面会生成一个段错误。

 的char *类型;
字符*输出;对于(I = 0; I&小于10;我++){如果(STRCMP(GTK_OBJECT_TYPE_NAME(g_hash_table_lookup(widgetbuffer,分配由[i])),GtkAdjustment)== 0){
    类型=旋转;
    sprintf的(输出,%F,gtk_adjustment_get_value(GTK_ADJUSTMENT(g_hash_table_lookup(widgetbuffer,分配由[i]))));}否则如果(的strcmp(GTK_OBJECT_TYPE_NAME(g_hash_table_lookup(widgetbuffer,分配由[i])),GtkCheckButton)== 0){
    键入=检查;
    sprintf的(输出,%D,gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(g_hash_table_lookup(widgetbuffer,分配由[i]))));}否则如果(的strcmp(GTK_OBJECT_TYPE_NAME(g_hash_table_lookup(widgetbuffer,分配由[i])),GSList)== 0){
    类型=无线电;通过组合按键//循环,找到活跃的一个
    sprintf的(输出,%D,g_slist_position(g_hash_table_lookup(widgetbuffer,分配[I]),
                g_slist_find_custom(g_hash_table_lookup(widgetbuffer,分配[I]),
                    空,(GCompareFunc)searchRadio)));}否则如果(的strcmp(GTK_OBJECT_TYPE_NAME(g_hash_table_lookup(widgetbuffer,分配由[i])),GtkComboBox)== 0){
    键入=二合一;
    sprintf的(输出,%D,gtk_combo_box_get_active(GTK_COMBO_BOX(g_hash_table_lookup(widgetbuffer,分配由[i]))));}否则如果(的strcmp(GTK_OBJECT_TYPE_NAME(g_hash_table_lookup(widgetbuffer,分配由[i])),GtkEntry中)== 0){
    类型=条目;
    输出=(字符*)gtk_entry_get_text(GTK_ENTRY(g_hash_table_lookup(widgetbuffer,分配由[i])));}
[...]


解决方案

如果您的平台拥有的snprintf或类似(大多数人),那么你想要的东西是这样的:

  INT N =的snprintf(NULL,0,%s是%D,somestring,someinteger);
的char * p = malloc的(N + 1);
sprintf的(P,%s是%D,somestring,someinteger);

的snprintf 第一个调用返回多少个字符将需要存储格式的输出,但实际上并没有做任何格式。然后你分配所需的空间,做真正的格式化。

I need to store data (Of previously unknown format/size) inside a string for processing later (To be stored in an XML file)

How do I do this?

As you can see, the code below will generate a segfault.

char * type;
char * output;

for (i=0; i< 10; i++){ 

if(strcmp(GTK_OBJECT_TYPE_NAME(g_hash_table_lookup(widgetbuffer,allocate[i])), "GtkAdjustment") == 0){
    type = "spin";
    sprintf(output, "%f", gtk_adjustment_get_value(GTK_ADJUSTMENT(g_hash_table_lookup(widgetbuffer,allocate[i]))));

}else if(strcmp(GTK_OBJECT_TYPE_NAME(g_hash_table_lookup(widgetbuffer,allocate[i])), "GtkCheckButton") == 0){
    type = "check";
    sprintf(output, "%d", gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(g_hash_table_lookup(widgetbuffer,allocate[i]))));

}else if(strcmp(GTK_OBJECT_TYPE_NAME(g_hash_table_lookup(widgetbuffer,allocate[i])), "GSList") == 0){
    type = "radio"; // Loop through grouped buttons and find active one
    sprintf(output, "%d", g_slist_position(g_hash_table_lookup(widgetbuffer,allocate[i]),
                g_slist_find_custom(g_hash_table_lookup(widgetbuffer,allocate[i]),
                    NULL, (GCompareFunc) searchRadio)));

}else if(strcmp(GTK_OBJECT_TYPE_NAME(g_hash_table_lookup(widgetbuffer,allocate[i])), "GtkComboBox") == 0){
    type = "combo";
    sprintf(output, "%d", gtk_combo_box_get_active(GTK_COMBO_BOX(g_hash_table_lookup(widgetbuffer,allocate[i]))));

}else if(strcmp(GTK_OBJECT_TYPE_NAME(g_hash_table_lookup(widgetbuffer,allocate[i])), "GtkEntry") == 0){
    type = "entry";
    output = (char *) gtk_entry_get_text(GTK_ENTRY(g_hash_table_lookup(widgetbuffer,allocate[i])));

}
[...]

解决方案

If your platform has snprintf or similar (most do), then you want something like this:

int n = snprintf( NULL, 0, "%s is %d", somestring, someinteger );
char * p = malloc( n + 1 );
sprintf( p, "%s is %d", somestring, someinteger );

The first call to snprintf returns how many chars would be needed to store the formatted output, but doesn't actually do any formatting. Then you allocate the space needed and do the real formatting.

这篇关于未知长度的C字符串定义的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆