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中,这些代码是可以工作的。
当做普拉迪克
- 即使是用VisualStudio的C/C++编译器编译,也会在运行时获得访问冲突。所以不,这段代码在Visual Studio中不能"工作"。
- 是的,但至少可以编译。使用GNU,它甚至不会编译,这表明与微软相比,自由软件的质量很低。
- 当代码错误时,"它编译"不是一件好事。
- 不管代码是否错误,一个有bug的工作程序比一个甚至不工作的程序更好
- 有了这种态度,你只要把每一行出错的地方都写出来就行了。迭代直到编译。将绝对垃圾传递给system()有多糟糕?
- 至少了解一下如何使用sprintf。
- 是的,我明白,但我的观点是,最好是有一辆车开着有问题,然后一辆车不开。当然每个人都能同意
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的方式就是这样。