sscanf加入0';这是我的底线
我正在为一个汇编程序编写一些c代码,该汇编程序用于为我们的教科书设计的虚拟计算机。关键是要让二进制输出看起来与通过教科书附带的程序运行assembly后相同。我正在执行最后一条转换为二进制的指令BR(用于分支),并且在使用sscanf时遇到了一些问题。功能是,sscanf加入0';这是我的底线,c,scanf,C,Scanf,我正在为一个汇编程序编写一些c代码,该汇编程序用于为我们的教科书设计的虚拟计算机。关键是要让二进制输出看起来与通过教科书附带的程序运行assembly后相同。我正在执行最后一条转换为二进制的指令BR(用于分支),并且在使用sscanf时遇到了一些问题。功能是, char* br(char* line) { int num, i, l, n = 0, z = 0, p = 0; char bin[17] = "0000"; char word[20], arg1[20]; sscanf(line
char* br(char* line) {
int num, i, l, n = 0, z = 0, p = 0;
char bin[17] = "0000";
char word[20], arg1[20];
sscanf(line, "%S%S", word, arg1);
l = strlen(word);
for (i = 2; i < l; i++) {
if (word[i] == 'N') {
n = 1;
} else if (word[i] == 'Z') {
z = 1;
} else if (word[i] == 'P') {
p = 1;
}
}
bin[4] = n + '0';
bin[5] = z + '0';
bin[6] = p + '0';
while (label[i] != 0) {
if (strcmp(label[i], arg1) == 0) {
num = address[i] - currentAddress - 1;
decToBinary(num, arg1);
break;
}
i++;
}
for (i = 7; i < 16; i++) {
bin[i] = arg1[i];
}
return bin;
}
char*br(char*line){
int num,i,l,n=0,z=0,p=0;
char-bin[17]=“0000”;
字符字[20],arg1[20];
sscanf(行“%S%S”,字,arg1);
l=strlen(单词);
对于(i=2;i
我遇到的问题是sscanf在word和arg1中放置的每个字符之间添加0,因此它们被终止。传入字符串“BRZP START”被分别分为“B”和“S”,分别表示word和arg1。我已经以这种方式使用过很多次sscanf,但不知道为什么它现在不起作用。如果你看一下sscanf的示例,似乎%S(大写字母S)实际上没有任何意义(根据printf手册页,它看起来好像相当于“ls”,它从字符串中读取宽字符,但不应使用。当短字符字符串转换为长字符字符串时,每秒钟的字符似乎等于零)。试试这个:
sscanf(line, "%s%s", word, arg1);
您没有指定正在使用的主机操作系统或开发平台,但考虑到在某些实现中,
%S
告诉sscanf
读取宽字符,我一点也不奇怪每个字符都有两个字节。如果您的输入是ASCII,您将得到ASCII字符加上一个空字节,正如您所看到的。解决方案很简单:使用%s
而不是%s
您是否尝试过在%s%s
之间使用空格?OP使用了%s%s
,您的解决方案明智地建议使用%s
而不是%s
。但不需要增加空间<代码>%s所有就绪跳过前导空格<代码>“%s%s”更接近OP的风格。好建议,更改madeOops!我建议使用一个没有空格的选项,并在应该使用“已经”时使用“准备就绪”。