scanf的返回值和输入验证

时间:2013-06-03 16:26:53

标签: c validation scanf

输入应具有整数字整数的格式,中间有空格。我已经编写了下面的代码,据我所知它的工作原理。我现在正在处理代码的错误检查部分。

如果输入的格式不正确,我该如何检查呢?

我需要检查的三种错误类型将具有以下输入格式:“WORD 99”,“10WORD 33”和“10 WORD”。

提供更多细节。输入的格式为10 READ 10.第一个整数10是输入的其余部分将存储在的存储器地址。在这种情况下,单词或READ是指令。 convertOpCode函数匹配字中的字母以查找与已知指令的匹配,并将指令代码保存到操作代码寄存器中,即* operationCode。第二个整数是操作使用的地址。 Read会将用户输入存储到第二个整数的地址位置。

现在,convertoOpCode函数抛弃第一个空格并读入下一个字符,直到它读取空格。如果空格之间的字符与已知操作匹配,则保存相应的操作代码并返回,如果未找到已知操作,则抛出错误并退出程序。

同样,我仅限于显示的变量。我有int数组“memory”来存储编译结果和显示的5个int变量。我无法创建任何其他数组或缓冲区。

int compile( int memory[], int *accumulator, int *instructionCounter, 
    int *instructionRegister, int *operationCode, int *operand ){

while( scanf( "%d", accumulator) == 1 ){

    *instructionRegister = convertOpCode( instructionCounter, instructionRegister, operationCode, operand );
    if( *instructionRegister == 0 ){
        ERRORUC( accumulator );
    scanf( "%d", operand );
    if( *operationCode != 22 ){
        if( *operand > 99 ){
            ERROROPERAND( accumulator );
        memory[ *accumulator ] = ( ( *operationCode ) * 100 ) + ( *operand ); 
    }
    else{
        if( *operand > 9999 ){
            ERRORSET( accumulator );
        }
        memory[ *accumulator ] = *operand;
    }
}
checkHalt( memory, instructionCounter, accumulator );
print( memory );
return 0;

}

这里要求的是convertOpCode函数的外观。

int convertOpCode( int *reg1, int* reg2, int* opCode, int* reg3 ){

    getchar();
    *reg1 = (int)getchar();
    *reg2 = (int)getchar();
    *reg3 = (int)getchar();
    *opCode = (int)getchar();

    switch( *reg1 ){
        case (int)'R':
            if( *reg2 == (int)'E' && *reg3 == (int)'A' && *opCode == (int)'D' ){
                *reg1 = (int)getchar();
                if( *reg1 == (int)' ' ){
                    *opCode = READ;
                    return 1;
                }else{
                    return 0;
                }
            }else{
               return 0;
            }
        case (int)'W'.....

}

1 个答案:

答案 0 :(得分:0)

我想我不会滥用其他整数来读取操作码的字符。我完全不清楚这项任务的要求,但我过去曾教过C,如果没有其他办法,我也不会提出这样的要求(你的老板可能会有所不同:-))。

我认为您可以在阅读时解析字符,构建一个案例结构,它是允许单词的树。让我们说(例如,简单)你有指示 ASK MUL SUB

int getopcode()
{
    if (getchar()==' ') {  // ok, starting with space

        switch (getchar()) { 

            case 'A': // probably A(DD) but make sure ...
                if (getchar()=='D' && getchar()=='D') {
                    return 1; // opcode for ADD
                }
                break;


            case 'M': // probably M(UL) but make sure ...
                if (getchar()=='U' && getchar()=='L') {
                    return 2; // opcode for MUL
                }
                break;

            ....
        }
    }

    return 0;  // error if we arrive here. 
}

如果您的操作以相同的字母开头(ADD和ASK),则需要在“A”开关内堆叠第二个开关,以便根据第二个字母继续操作。

对于主程序,我只是为了更多错误检查而重新编写了一些内容(不确定你的某些宏如ERRORUC,但我相信你会得到图片):

while( scanf( "%d", accumulator) == 1 ){

    *instructionRegister = getopcode();
    if (*instructionRegister!=0) {

        if (scanf(" %d", operand )==1) {  // ok, one more decimal operand

            switch (*operationCode) {   // operand error checking per opcode

                case 22: 
                        if( *operand> 99 )
                            ERROROPERAND(accumulator);
                         break;

                default:
                        if( *operand > 9999 )
                            ERRORSET(accumulator);
                        break;
            }
        }
        else {
            // error reading 2nd operand
            ERRORUC( accumulator );
        }

    }
    else {
        // error in opcode
        ERRORUC( accumulator );
    }


    if ( no error set in accumulator, i.e. no ERRORxx macro called) {
         // accumulator, instructionRegister and operand are ok here
         // write to memory
    }
    else 
        break; // break the loop, end compiling
}

print( memory );
return 0;

需要做一些事情来根据错误打破循环,或者最初不要让它成为循环。