atoi 转换以返回单个数字值

Posted

技术标签:

【中文标题】atoi 转换以返回单个数字值【英文标题】:atoi conversion to return a single digit value 【发布时间】:2011-11-14 19:38:31 【问题描述】:

我有一个这样的字符数组:

+---+---+---+ |53.|.7.|...| |6..|195|...| |.98|...|.6.| +---+---+---+

我正在使用 int 数组在特定索引处存储特定值。 对于转换,我使用了

            for(int i=0;i<27;i++)
        
        inputNumArray[i]=atoi(&inputInitial[indexArray[i]]);        
        

现在问题是我想要的输出是:

5 3 0 0 7 0 0 0 0 6 0 0 1 9 5 0 0 0 0 9 8 0 0 0 0 6 0

代码返回给我这个:

53 3 0 0 7 0 0 0 0 6 0 0 195 95 5 0 0 0 0 98 8 0 0 0 0 6 0

我认为原因是 atoi 扫描直到找到字符,对于 atoi(&inputInitial[i]) 它将读取直到 i+1、i+2... 等等直到它遇到错误。 我想将 atoi 扫描限制为仅单个字符。有可能还是我应该使用其他功能?

【问题讨论】:

【参考方案1】:

不要用atoi,就用这个:

if(isdigit(c))
    val = c - '0';
else
    val = 0

【讨论】:

我会提议 (isdigit(c))?(c-'0'):0 但这个没问题 ^^ 我少了一个分号而你没有,所以你的更好...我没有使用 ?: 因为 typedef1 显然是 C 新手,我认为更具可读性更好这个案例。至少这是我的正式借口,不过这可能是我长期使用 Python 的原因。 val = isdigit(c) ? c-'0':0;我相信。 宏在 C++ 中是邪恶的,它们比三元运算符差得多。但我必须承认,typedef1 的解决方案看起来更加荒谬。只需按照 zmbq 最初的方式编写即可。如果我记得的话,我稍后会 +1 解决方案,我当天没有票了:p @typedef1,这并不荒谬,但对眼睛很不利。您希望您的程序易于阅读。这通常比在函数调用上节省几个周期重要得多。【参考方案2】:

你对atoi 的猜测是正确的。如果要转换单个数字,可以创建一个仅包含该数字的字符串:

char temp[2] =  inputInitial[indexArray[i]], '\0' );
inputNumArray[i] = atoi( temp );

【讨论】:

【参考方案3】:

您可以暂时将字符串中下一个字符的值更改为 0,因此 a to i 只读取一个数字。

【讨论】:

【参考方案4】:

atoi 需要一个以空字符结尾的字符序列。

最好编写自己的带有单个字符的函数,例如:

int ctoi ( char ch ) 
    if ( ch >= '0' && ch <= '9' ) return ch - '0';
    return -1; // error
    

【讨论】:

【参考方案5】:

输入格式我不清楚。但是,这是我对数组所做的:

char x[] = "12345678";
int out[] = new out[strlen(x)];

int* oit = out;
for (char* it=x; it < x+sizeof(x);)
     *oit++ = (*it++)-'0'


// out[] now contains char-by-char value as int

【讨论】:

以上是关于atoi 转换以返回单个数字值的主要内容,如果未能解决你的问题,请参考以下文章

atoi函数的用法

atoi函数原型

save方法返回值为联合主键的id时候怎么转换为string类型

atoi()函数的实现

模拟实现库函数的atoiatof和itoa

atoi() 不断返回 0 [关闭]