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 转换以返回单个数字值的主要内容,如果未能解决你的问题,请参考以下文章