sscanf将0添加到我的字符串中

时间:2013-11-24 02:50:57

标签: c scanf

我正在为用于为我们的教科书设计的虚拟计算机的汇编程序编写一些c代码。关键是要使二进制输出看起来与通过教科书附带的程序运行程序集后的内容相同。我在最后一条转换为二进制,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;
}

我遇到的问题是sscanf在word和arg1中的每个字符之间添加0,因此它们被终止。输入字符串“BRZP START”分为“B”表示字,“S”表示arg1。我已经以这种方式使用了sscanf已经并且不知道为什么它现在不能正常工作。

2 个答案:

答案 0 :(得分:0)

如果你看一下man page sscanf,似乎%S(大写字母S)并不真正意味着什么(基于printf手册页,它看起来好像它等同于“ls”,从字符串中读取宽字符,但不应该使用。当一串短字符转换为长字符串时,每隔一个字符似乎等于零)。试试这个:

sscanf(line, "%s%s", word, arg1);

答案 1 :(得分:0)

您没有指定您正在使用的主机操作系统或开发平台,但考虑到%S告诉sscanf,我对每个字符都获得两个字节并不感到惊讶。在某些实现中读取宽字符。如果您的输入是ASCII,您将获得ASCII字符加上一个空字节,就像您所看到的那样。解决方案很简单:使用%s而非%S