【问题标题】:Variable empty after comparison比较后变量为空
【发布时间】:2018-07-15 19:50:21
【问题描述】:

在代码中,当我打印 var_value 时,它​​会显示它的内容,但是当我需要稍后在 if else 语句中分配它时,它仅在最后一个 IF 中为空,我不知道为什么会这样。如果我删除最后一条语句,其他三个都可以通过。

    while ((read = getline(&line, &len, f)) != -1){
    printf("%s\n", line);
    char *token;
    token = strtok(line, "=");
    var_name = token;

    /* Separate every line by the '=' character */
    while( token != NULL ) {
            var_value = token;    
            token = strtok(NULL, "=");
    }
    printf("%s\n", var_name);
    printf("%s\n", var_value);

    // Obtain the parameters
    if (strcmp(var_name, "puerto") == 0) {
        puerto = atoi(var_value);
        parameters_count += 1;
    } else if (strcmp(var_name, "tamano_tabla") == 0) {
        tamano_tabla = atoi(var_value);
        parameters_count += 1;
    } else if (strcmp(var_name, "periodo_archivo") == 0) {
        periodo_archivo = atoi(var_value);
        parameters_count += 1;
    } else if (strcmp(var_name, "archivo_tabla") == 0) {
        printf("%s var val\n", var_value);
        strcpy(archivo_tabla, strtok(var_value, "\n")); //Remove \n and copy to destination variable
        parameters_count += 1;
        printf("%s filetabla\n", archivo_tabla);
    }
}

编辑:控制台中的结果,在最后一个之后,分段错误

puerto=1212

puerto
1212

archivo_tabla=tabla.xml

archivo_tabla
tabla.xml

tabla.xml
 var val

【问题讨论】:

  • 你知道strtok修改了它的第一个参数吗?
  • 这里不足以说明问题所在。请使用minimal reproducible example 更新您的问题。
  • 我们对问题可能是什么有一些猜测,但您没有给我们足够的信息来给您一个自信的答案。提交minimal reproducible example,不要忘记在其中包含一些会产生不良行为的输入。
  • 添加了完整的while代码
  • @purplepsycho:更糟糕的是,它使用全局状态,因此尝试在被标记化的字符串之间来回切换(即使在完全不同的函数中)将不起作用。 strtok_r(Windows 上为strtok_s)至少可以避免这个问题。

标签: c strtok strcpy


【解决方案1】:

您的输出不支持您的论点

在代码中,当我打印 var_value 时,它​​显示了它的内容,但是当我 需要稍后在 if else 语句中分配它,它只为空 IN 最后一个如果 [...]。

事实上,您的输出显示相反:var_val 打印得很好。我不得不假设您对它的值以换行符结尾这一事实感到困惑,该换行符也被打印出来。因此,“var val”出现在行首。这是var_val 的预期值,包括换行符,后跟“var val”:

tabla.xml
 var val

getline() 提供的字符串中存在换行符毕竟是接下来发生的strtok(var_value, "\n") 的全部意义。或者我假设。

另请注意,虽然您提供的输出似乎相对于您提供的代码被截断,但在我的测试中,var_val 的内容也成功复制到变量archivo_tabla,而不是讨厌的换行符。

【讨论】:

    【解决方案2】:

    这条线是可疑的:strcpy(archivo_tabla, strtok(var_value, "\n")); //Remove \n and copy to destination variable

    strtok 改变 var_value。您似乎正在将 archivo_tabla 复制到“\n”之后的 var_value 的其余部分(这实际上没有意义)

    https://www.tutorialspoint.com/c_standard_library/c_function_strtok.htm

    【讨论】:

    • 是的,但这不会影响出现在该行之前的printf()
    • 确实如此;也许它正在循环运行?我们没有控制流的全貌
    • 它在一个循环中。 if 之外的 printf 打印 var_value 所做的事情,但在 strtok 之前还有另一个 printf 并且它什么也不返回。
    • @information_interchange:嗯,strcpy args 倒退了。目标是第一个参数,所以它复制 to archivo_tabla,而不是 from 它。第一个strtok 调用返回\n 之前的第一个非空数据的地址,而不是之后;它有效地复制了剥离前导换行符后的任何内容,直到第一个非换行符之后的第一个换行符。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-19
    • 1970-01-01
    • 2014-03-09
    • 1970-01-01
    • 2016-08-05
    • 2018-03-20
    相关资源
    最近更新 更多