Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sscanf加入0';这是我的底线_C_Scanf - Fatal编程技术网

sscanf加入0';这是我的底线

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

我正在为一个汇编程序编写一些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, "%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!我建议使用一个没有空格的选项,并在应该使用“已经”时使用“准备就绪”。