将罗马数字转换为十进制数字

时间:2016-10-25 15:00:50

标签: c

我编写以下代码使用C语言将罗马数字转换为十进制数字,但它没有给出正确的答案。我也做了干跑。请帮忙。

#include <stdio.h>

int main()
{
    char ch;
    int num, newnum=0, result=0;

    printf("Enter number:");
    scanf("%s", &ch);

    while (ch != 'n') {
        switch (ch) {
        case 'i': num = 1; break;
        case 'v': num = 5; break;
        case 'x': num = 10; break;
        case 'l': num = 50; break;
        case 'c': num = 100; break;
        case 'd': num = 500; break;
        case 'm': num = 1000; break;
        }

        if (newnum > num) {
            result = result - num;
            newnum = num;
        } else {
            result = result + num;
            newnum = num;
        }
        printf("Enter number:");
        scanf("%s", &ch);
    }
    printf("%d", result);
}

1 个答案:

答案 0 :(得分:0)

main()

应该写

int main( void )

这不仅仅是一种风格的特征 - 从C99开始,不再允许隐式输入。

scanf("%s", &ch);

不是您想要的 - s转换说明符期望ch指向char数组的第一个元素,而不是单个char对象。它告诉scanf读取非空白字符的序列并将它们存储到缓冲区,它会将零终止符写入该缓冲区的末尾(即存储一个-character string ,你需要一个2元素的char数组。如上所述,scanf将写入ch和紧跟在内存中的字节,这可能会或可能不会在其他地方产生影响。

要从标准输入读取单个字符,请使用

scanf( " %c", &ch ); // note leading blank in format string; this tells scanf
                     // to skip over any leading whitespace characters

int ch;
...
ch = getchar(); // getchar returns int, not char

您可能希望在纸上完成转换算法几次。当您输入i后跟v时会发生什么?