C Bug中字符串的序列化


Serialization of String in C Bug

C中字符串的序列化存在问题。编译器无法正确接受格式类型,即使类型等效:

1
2
3
4
5
unsigned int voltage = 24;
unsigned int cfac = 23;
char buf[100];
sprintf("echo Voltage: %u, Cfac: %u > v.txt", voltage, cfac);
system(buf);

但是,编译器错误地将无符号整数解释为指针:

错误:从"unsigned int"到"const char*"的转换无效

我仔细检查了一下%u是否是无符号int,而不是const char*,但是这个编译器无法解析。有人能给我解释一下为什么这个GNU编译器如此糟糕吗?我知道在Visual Studio中,这些代码是可以工作的。

当做普拉迪克


sprintf()的第一个参数是buf,而不是格式字符串。

另外,不要使用sprintf(),因为它可能会导致缓冲区溢出,而是使用snprintf()或等效工具,

1
2
3
4
5
int length;
length = snprintf(buf, sizeof buf,"echo Voltage: %u, Cfac: %u > v.txt", voltage, cfac);
if ((length != -1) && (length < sizeof buf)) {
    system(buf);
}

最后,使用system()来执行echo是非常没有意义的。

因为你的代码显然等同于

1
2
3
4
5
FILE *file = fopen("v.txt","w");
if (file != NULL) {
    fprintf(file,"Voltage: %u, Cfac: %u", voltage, cfac);
    fclose(file);
}

如果您将调用shell,那么您应该使用程序的输出,而不是从程序内部调用。阅读关于Unix的哲学,虽然不完美,但他们确实知道这一点,Unix的方式就是这样。