2013-03-20 54 views
0

我正处于使用C++编写程序的早期阶段,它用其英文对应项替换整数输入。我不想要关于如何制作这个程序的说明,而是想知道某个部分代码如何以某种方式行为,并且可能会提示如何解决这个问题。C++ - 使用临时变量的索引数组

std::string strToEng(std::string s) 
{ 
    int sInt = atoi(s.c_str()); 


    std::string digit1[] = {"zero", "one", "two", "three", "four", "five", "six", "seven", 
          "eight", "nine", "ten", "eleven", "twelve", "thirteen", 
          "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", 
          "nineteen"}; 

    switch(s.size()) 
    { 
    case 1: 
    { 
     int temp = int(s[0]); 
     return digit1[temp]; 
    } 
    } 

    return "error"; 
} 

问题在于switch语句中的digit1数组。当我编译此代码时,情况1不会返回所需的输出。如果我将digit1 [temp]更改为某种常数(即digit1 [3]),它会正确显示。使用变量来索引数组是否存在问题?我该如何解决这个问题?

编辑:也许欺骗,我没有办法处理数字高于九,但他们仍然包含在digit1。原因是这段代码被重写了好几次。

+2

*“使用变量来索引数组是否存在问题?”主,我希望不会。 – WhozCraig 2013-03-20 20:06:41

+1

问题看起来像它与你的转换'int(s [0])'有关。这对我来说看起来像一个强制转换,它简单地将char字节解释为int,这取决于ascii值。 '1'与1不一样。您将需要使用某种方法将该字符转换为int。 (我看你已经在你的代码中使用atoi) – Porkbutts 2013-03-20 20:09:24

+0

'int temp = int(s [0]);'???打开s.size()?不是很好。 – 2013-03-20 20:09:36

回答

2

你应该使用digit1[sInt]如您已经转换为字符串转换成int值...

s[0]只是字符串的第一个字符,所以如果第一个字符是'0'那么它的值是48(见ASCII表格),然后你访问你桌子的第49个元素......在你的案例1中,你可以尝试int(s[0])-'0',它应该可以工作。

+0

啊,谢谢!我没有考虑到这一点。这似乎是最好的解决方案。我没有使用sInt来达到这个目的(事实上我以为我把它删除了......),因为我打算扩展这个来处理多个数字。 – Do8fe7aevol4lopo 2013-03-20 20:18:47

+0

@Steven J Wayne Esq:atoi已经可以为你处理多个数字了。 – 2013-03-20 20:21:05

0

您将s的第一个字符转换为int,所以如果s包含一个数字,则该值位于48到57的十进制数字的ASCII值范围内。为什么不使用正确创建的int sInt你的函数的第一行?