【问题标题】:Variable Reassignment - C变量重新分配 - C
【发布时间】:2016-03-01 03:32:18
【问题描述】:

输入:

5, 08:00:00, 2, 30
5, 08:00:10, 6, 0

程序应该输出:

Heart Rate:
08:00:00: 30

但它却输出:

Heart Rate:
08:00:10: 30

基本上,我遇到的问题是,对于每个 Element 结构,它都会打印相同的时间戳,即最后输入的时间戳。

有人可以帮忙吗?对不起,如果我太简短了,我不想让这篇文章超载。如果您需要更多说明,请告诉我。

typedef struct{
    char *timestamp;
    int value;
}Element;

typedef char f_string[MAXCHARS + 1];

typedef struct {
    int nfields;
    f_string field[MAXFIELDS];
} csv_line;

void main(){
    int i, j;
    csv_line data;
    int run = 1;
    Element temperature;
    temperature.timestamp = "\0";
    temperature.value = -1;
    Element heart_rate;
    heart_rate.timestamp = "\0";
    heart_rate.value = -1;
    Element systolic_pressure;
    systolic_pressure.timestamp = "\0";
    systolic_pressure.value = -1;
    Element diastolic_pressure;
    diastolic_pressure.timestamp = "\0";
    diastolic_pressure.value = -1;
    Element respiration_rate;
    respiration_rate.timestamp = "\0";
    respiration_rate.value = -1;

    /* initialize health data records for each patient */

    for( i=0; i < MAXPATIENTS; i++ ){
            record[i].id = i + 1;
            for( j=0; j < MAXTYPES; j++ ){
                record[i].buffer[j].start = 0;
            record[i].buffer[j].end = 0;
            }
        }   
    printf("Welcome to the Health Monitoring System\n\n");

    while (run == 1) {  

        data = get_line();

        char *timestamp = data.field[1];
        int value = atoi(data.field[3]);
        int type = atoi(data.field[2]);

        switch(type) {
            case 1:
                temperature.timestamp = timestamp;
                temperature.value = value;
                break;
            case 2:
                heart_rate.timestamp = timestamp;
                heart_rate.value = value;
                break;
            case 3:
                systolic_pressure.timestamp = timestamp;
                systolic_pressure.value = value;
                break;
            case 4:
                diastolic_pressure.timestamp = timestamp;
                diastolic_pressure.value = value;
                break;
            case 5:
                respiration_rate.timestamp = timestamp;
                respiration_rate.value = value;
                break;
            case 6:
                run = 0;
                break;
        }   
    }
    print_data(atoi(data.field[0]), temperature, heart_rate, systolic_pressure, diastolic_pressure,
        respiration_rate);

    printf("\nEnd of input\n");
}
void print_data(int id, Element temperature, Element heart_rate, Element systolic_pressure,
            Element diastolic_pressure, Element respiration_rate) {
    printf("-----------------------------------------------------------------------\n");
    printf("Readings for Patient ID = %d are:\n", id);
    printf("Temperature:\n");
    printf("%s: %.1f\n", temperature.timestamp, (float)temperature.value / 10);
    printf("Heart Rate:\n");
    printf("%s: %d\n", heart_rate.timestamp, heart_rate.value);
    printf("Systolic Pressure\n");
    printf("%s: %d\n", systolic_pressure.timestamp, systolic_pressure.value);
    printf("Diastolic Pressure\n");
    printf("%s: %d\n", diastolic_pressure.timestamp, diastolic_pressure.value);
    printf("Respiration Rate\n");
    printf("%s: %d\n", respiration_rate.timestamp, respiration_rate.value);
    printf("-----------------------------------------------------------------------\n");
}

【问题讨论】:

  • 复制指针不会复制它指向的内存。
  • 那我该怎么办呢?
  • 很难在不了解您如何定义数据结构的情况下提出建议。但这是一个更大的话题。对指针和内存的基本理解是您在第一个“hello world”程序之后几乎需要立即学习的内容。这个问题更多地是关于“我如何用 C 编程”而不是“我如何解决我的问题”。
  • 我很少使用指针;我仍在学习和试验它们。我已经添加了正在使用的结构。
  • 为了便于我们人类阅读和理解:1) 一致缩进,在每个左大括号'{'后缩进。在每个右大括号 '}' 之前取消缩进。切勿使用制表符进行缩进。建议每个缩进级别为 4 个空格,因为即使使用可变宽度字体也是如此。 2) 通过空行分隔代码块(for、if、else、while、do...while、switch、case、default)。 3) 包括#include 语句,这样我们就不必猜测了。

标签: c variables


【解决方案1】:

使用此输入:

5, 08:00:00, 2, 30
5, 08:00:10, 6, 0

并假设(大假设,因为未提供 get_line() 的代码)

第一次调用get_line() 导致数据包含:

4, { "5", "08:00:00", "2", "30" }


data.field[0][] = "5"
data.field[1][] = "08:00:00" 
data.field[2][] = "2"
data.field[3][] = "30"

然后这三行:

char *timestamp = data.field[1];
int value = atoi(data.field[3]);
int type = atoi(data.field[2]);

结果:

timestamp contains a pointer to data.field[1]
value     contains: 30
type      contains: 2

然后case 2: 结果:

 heart_rate.timestamp = timestamp; = pointer to data.field[1]
 heart_rate.value = value;         = 30

然后将下一行读入与第一行相同的内存中

然后...对 print_data() 的调用:其中包含这两行:

printf("Heart Rate:\n");
printf("%s: %d\n", heart_rate.timestamp, heart_rate.value);

'heart_rate.timestamp' 仍然指向data 中的内存位置,该位置现在包含来自第二行的信息。

这就是意外输出的原因。

解决这个问题:这一行:

char *timestamp = data.field[1];

需要改成:

char *timestamp = strdup(data.field[1]);

当然这增加了一些代码要求:

1) check (!=NULL) the returned value from `strdup()` 
    to assure the operation was successful.
2) before exiting the program, need to pass each 'timestamp' to `free()`

free( heart_rate.timestamp );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多