我想将文本文件中的十六进制数读入无符号整数,以便我可以执行机器指令.它只是一个模拟类型的东西,它查看文本文件内部并根据值及其相应的指令输出寄存器中的新值.
例如,说明将是:
文本文件在新行中包含类似的内容.(在十六进制中)
我的问题是将每个单独的指令复制到无符号整数...我该怎么办?
#include <stdio.h>
int main(){
FILE *f;
unsigned int num[80];
f=fopen("values.txt","r");
if (f==NULL){
printf("file doesnt exist?!");
}
int i=0;
while (fscanf(f,"%x",num[i]) != EOF){
fscanf(f,"%x",num[i]);
i++;
}
fclose(f);
printf("%x",num[0]);
}
Run Code Online (Sandbox Code Playgroud)
你走在正确的轨道上.这是我看到的问题:
fopen()返回,则需要退出NULL- 您正在打印错误消息,但随后继续.i >= 80,所以你不会读取比你有空间更多的整数.num[i]不是值fscanf.fscanf()在循环中调用了两次,这意味着你丢弃了一半的值而没有存储它们.以下是修复这些问题的样子:
#include <stdio.h>
int main() {
FILE *f;
unsigned int num[80];
int i=0;
int rv;
int num_values;
f=fopen("values.txt","r");
if (f==NULL){
printf("file doesnt exist?!\n");
return 1;
}
while (i < 80) {
rv = fscanf(f, "%x", &num[i]);
if (rv != 1)
break;
i++;
}
fclose(f);
num_values = i;
if (i >= 80)
{
printf("Warning: Stopped reading input due to input too long.\n");
}
else if (rv != EOF)
{
printf("Warning: Stopped reading input due to bad value.\n");
}
else
{
printf("Reached end of input.\n");
}
printf("Successfully read %d values:\n", num_values);
for (i = 0; i < num_values; i++)
{
printf("\t%x\n", num[i]);
}
return 0
}
Run Code Online (Sandbox Code Playgroud)
您还可以使用函数strtol().如果使用16的基数,它会将十六进制字符串值转换为int/long.
errno = 0;
my_int = strtol(my_str, NULL, 16);
/* check errno */
Run Code Online (Sandbox Code Playgroud)
编辑:另外注意,各种静态分析工具可能会将像atoi()和scanf()这样的东西标记为不安全.atoi已经过时,因为它没有像strtol()那样检查错误.另一方面,scanf()可以执行各种缓冲区溢出,因为它不检查发送到scanf()的类型.例如,你可以给一个指向scanf的短指针,其中读取值实际上是一个很长的....并且繁荣.