C程序将值读入两个独立的部分?

时间:2015-04-05 21:24:16

标签: c assembly

- 不重复。计划目标是相同的,但需要采用不同的方式,这将在下面解释。这个问题有两个部分,如果我不完全按照需要做第一部分,那么我就不能做第二部分了.-

我需要编写一个C程序,然后根据C程序编写一个在功能上相同的汇编程序。我发现我的C程序:读取包含数字的用户输入,然后单个(')或双(")来表示英尺和英寸,并一直提示用户输入0,然后总结以英寸为单位输出所有条目并打印总长度,不适用于以下汇编函数:

void printStr(char *)
 Arguments:
 edi = address of null-terminated string to print
 Returns:
 Nothing

void printUInt(unsigned)
Arguments:
 edi = Unsigned integer to print
Returns:
 Nothing

char getchar()
Arguments:
 None
Returns:
 eax = the next character

uinsigned readUInt()
Arguments:
 None
Returns:
 eax = an unsigned int read from stdin.
       (eax is 0 on error)

这是C程序:

#include <stdio.h>
#include <string.h>
int main(void)
{
    char value[50];
    char *end;
    int sum = 0;
    int conv;
    do
    {
            printf("Enter a measurement and unit(Ex: 4' or 3\"; 0' or 0\"    when done): ");
            fgets(value, 50, stdin);
            conv = strtol(value, &end, 10);
            if(strstr(value, "\'") != NULL)
            {
                    conv = strtol(value, &end, 10);
                    sum = sum + (conv*12);
            }
            else if(strstr(value, "\"") != NULL)
            {
                    conv = strtol(value, &end, 10);
                    sum = sum + conv;
            }
    }
    while (conv != 0);

    printf("Total: %d, %s\n", sum, "inches" );
    return 0;
}

显然我不能将数字和引号分解成部分&#34;。我需要使用与上面列出的Assembly函数类似的函数。我不知道该使用什么,因为我觉得我已经尝试过类似的东西了。我被告知strtol()类似于readUInt(),我觉得这很好吗?无论如何,我不需要将字符串解析为stdin中的部分,而是需要将值中的值读入两个单独的部分&#34;。所以我想差异不是在一个部分读取然后解析,而是需要将输入读作两个不同的值。我怎么能用我现在拥有的东西做到这一点?请注意汇编功能可以执行的操作。当我去编写Assembly版本时,我必须能够使用这些函数代替C函数。

2 个答案:

答案 0 :(得分:1)

鉴于您仅使用encrypted.o中提供的功能的要求,您必须做出一些假设。 (1)encrypted.o包含函数定义。 (2)它有一个你可以包含的头文件,所以你可以使用提供的功能。 (3)readUInt在到达第一个非数字字符后将停止阅读并将其放回stdin

根据这些标准,并且仅使用提供的功能,您的代码将如下所示:

#include <stdio.h>

/* encrypted.h must contain declarations for the functions below, and
   must contain all required headers beyond `stdio.h` required here */
#include "encrypted.h"

/* function prototypes */
void printStr(char *);
void printUInt(unsigned);
unsigned readUInt();

int main(void)
{
    int c = 0;                 /* always initialize ALL variables */
    unsigned measurement = 0;
    unsigned sum = 0;

    while (1)
    {
        printStr ("Enter a measurement and unit(Ex: 4' or 3\"; 0' or 0\"    when done): ");

        /* read/validate measurement with readUInt() */
        if ((measurement = readUInt()) == 0|| measurement == EOF) {
            printStr ("notice: 0 read as measurement, or [CTRL+D] pressed, exiting.\n");
            break;
        }

        /* read/validate unit with getchar() */
        if (!(c = getchar()) || c == EOF) {
            printStr ("error: 0 unable to read unit.\n");

            /* empty the input buffer */
            while ((c = getchar()) != '\n' && c != EOF);

            /* get next input */
            continue;
        }

        if ( c == '\'')
        {
            sum += measurement * 12;        /* update sum as inches */
        }
        else if (c == '\"')
        {
            sum += measurement;             /* update sum as feet   */
        }
        else
            printStr ("error: invalid or no unit read.\n");

        /* empty the input buffer */
        while ((c = getchar()) != '\n' && c != EOF);
    }

    /* print final result using only printStr & printUInt */

    printStr ("\nTotal: ");
    printUInt (sum);
    printStr (" inches.\n\n");

    return 0;
}

注意没有encrypted.o/encrypted.h除了您之外没有其他人可以测试。编译类似于:

gcc -Wall -Wextra -c -o yourfile.o yourfile.c

链接类似于:

ld -o yourprog yourfile.o encrypted.o

如果您能提供encrypted.o我们可以测试。

答案 1 :(得分:0)

#include <stdio.h>
int main(void)
{
    int value;
    int unit;
    int sum =0;
    do
    {
            printf("Enter a measurement and unit(Ex: 4' or 3\"; 0' or 0\" when done): ");
            scanf("%d,%d", &value, &unit);
            unit = getchar();
            if(unit == '\'')
            {
                    sum = sum + (value*12);
            }
            else if(unit == '\"')
            {
                    sum = sum + value;
            }
    }
    while (value != 0);

    printf("Total: %d, %s\n", sum, "inches" );
    return 0;
}