c# 使用sscanf保存不同的变量类型

niwlg2el  于 2023-03-16  发布在  C#
关注(0)|答案(1)|浏览(239)

我想读取一个文件中写入的不同元素,并将它们保存到不同类型的变量中,我读取的文件只有一行key, value1, value2, value3,例如10, abc, 5, 2.35
我可以找到文件,打开它并读取行。但是,当涉及到将值存储到变量时,我遇到了麻烦。我尝试使用sscanf,因为文件中行的格式总是相同的,但是当我打印行时,我得到了不正确的不同值。我需要更改什么?

#define MAX_LEN 1024

int get_value(int key, char *value1, int *value2, double *value3){
    char name[1000];
    FILE *f;
    char line[MAX_LEN];
    char *k = 0;

    // Change directory where we work.
    if(chdir("FilesPractice1") == -1){
        perror("Error while changing directories.");
        return -1;
    }

    // Convert key to the name of the file.
    snprintf(name, 1000, "%d.txt", key);

    // Open the file.
    if((f = fopen(name, "r")) == NULL){
        // If the file doesnt exist, return -1.
        perror("Error: element with key value does not exist.");
        return -1;
    }

    // Get values and store them.
    fgets(line, MAX_LEN, f);    
    printf("%s\n", line);

    sscanf(line, " %s[^,], %s[^,], %d[^,], %lf", k, value1, value2, value3);

    // Printing the values.
    printf("%s\n", value1);
    printf("%p\n", (void *)value2);
    printf("%p\n", (void *)value3);

    return 0;
}
s8vozzvw

s8vozzvw1#

也许你的代码有多个问题,如问题注解中所建议的,但输出问题在这几行中:

printf("%p\n", (void *)value2);
    printf("%p\n", (void *)value3);

value2value3是指针(指向intdouble)。指针变量的值是某个其他值在内存中的地址。在sscanf()上正确使用value2value3(我假设函数get_value()也被正确调用,并且value1value2value3是有效的指针),但是您不打印读取的值,而是打印指针(即它们在内存中的地址)。
上面的两行应该是:

printf("%d\n", *value2);
    printf("%f\n", *value3);

这样,您就可以打印存储在这些内存地址中的值,而不是内存地址。
如果你想知道为什么前面的printf()行能正常工作,这是因为C语言中的字符串是由它在内存中的地址来标识的,而这正是value1
*value1不是整个字符串,而只是它的第一个字符。

相关问题