【问题标题】:Write char to struct in C在 C 中将 char 写入 struct
【发布时间】:2021-08-16 10:58:05
【问题描述】:

基本上我有一个存储我的常规程序设置的结构。我读入带有回调函数的配置以获取相应的值,但我无法将其写入结构。我已经尝试了从 memcpy 到 strcpy 到取消引用 char 指针的所有方法,但是每次结构中的 char 都保持为空。传递的字符串只包含一个字符,我检查了多次。此外,如果我将字符串 strcpy 到结构的其他字段,它工作正常。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct {
    char *datafile;
    char *logfile;
    char mode;
} general_settings;

void setSettingsData(void){
    log_trace("parsing config file for general settings initialisation");
    config_error_t rc = config_parse("config.ini", handle_settings_ini_file);
    if (rc != CONFIG_ERROR_NONE) {
        log_error("Error parsing configuration: %s on line %lu", config_get_error_string(rc), config_get_line_number());
    } else {
        log_info("Settings parsed successfully!");
    }
}

static config_error_t handle_settings_ini_file(char *section, char *key, char *value) {
    if(section != NULL && !strcmp("Allgemein", section)) {
        if (!strcmp("mode", key)) {
            general_settings.mode = strdup(value); // ??????
            log_info("Program Execution mode set to %s", value);
        } else {
            log_fatal("Unrecognized setting. Check for typos. Exiting...");
            exit(0);
        }
    }
    return CONFIG_ERROR_NONE;
}

【问题讨论】:

    标签: c struct


    【解决方案1】:

    由于valuechar *,您可以使用*value 获取它所指向的char

    所以你想要general_settings.mode = *value;

    你也可以使用general_settings.mode = value[0];

    由于a[b]*(a+b)相同,*(value + 0)value[0]相同,也与*value相同。

    【讨论】:

    • @Chris 你能更准确地说“它不起作用”是什么意思吗?你试过什么代码?你是怎么测试的?你期待什么结果?你得到了什么结果?
    • 结果总是general_settings中的char字段为空。我期待将字符从*value 写入general_settings.mode。我试过 strcpy、strdup、memcpy、取消引用指针并使用value[0] 访问它。
    • @Chris 您如何确定它是空的? char 的什么值为空? (据我所知,空不是字符。)
    • 当我试图读取它时,它导致了一个分段错误,即非空意味着其中没有字符,但空意味着该变量的内存不存在。
    • strdup 返回一个指向新分配的字符串的指针,你没有取消引用 general_settings.mode = strdup(value);现在我确实完全重写了您的 sn-p 并使其正常工作,但我真的不想将其粘贴为答案,因为它不是答案:) pastebin.com/5jAEp9wJ
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-30
    • 1970-01-01
    • 2017-01-26
    • 2011-06-16
    • 2010-09-30
    • 1970-01-01
    • 2021-12-14
    相关资源
    最近更新 更多