我对K& R C第二版的atoi()函数有一些问题。只应使用0到9之间的字符。但是在我的程序逻辑的某个地方,我做错了。
所以有这个功能:
#include <stdio.h>
int atoi(char s[]);
int main()
{
int i;
char ch;
char co[50];
int ci[50];
while(ch != EOF )
{
for(i=0;i<50-1 && (ch=getchar()) != EOF && ch != '\n';++i)
{
co[i] = ch;
/*ci[i] = atoi(co[i]);*/ /*bugged*/
ci[i] = atoi(co);
printf("%d \n",ci[i]);
}
if(ch == '\n')
{
co[i] = '\n';
}
++i;
co[i] = '\0';
}
return(0);
}
/* as in the book: */
/* atoi: convert s to integer */
int atoi(char s[])
{
int i, n;
n = 0;
for(i = 0; s[i] >= '0' && s[i] <= '9'; ++i)
{
n = 10 * n + (s[i] - '0');
}
return(n);
}
以下是我遇到的错误:
|In function 'main':
19|warning: passing argument 1 of 'atoi' makes pointer from integer without a cast [enabled by default]
3|note: expected 'char *' but argument is of type 'char'
||=== Build finished: 0 errors, 1 warnings (0 minutes, 0 seconds) ===|
答案 0 :(得分:2)
在
(s[i] = '0')
应该阅读
(s[i] - '0')
(注意减号而不是等号)。
这会将字符'0'
.. '9'
转换为数值0
.. 9
。
您也没有正确地呼叫atoi()
。它需要一个字符串,而不是char
。您应该从循环外部调用它。
并且ch
不是正确的类型(它应该是int
)。
答案 1 :(得分:1)
atoi();
函数需要指向字符串的指针。 char*
这是警告warning: passing argument 1 of 'atoi' makes pointer from integer without typecase
你声明co :: char co[50];
但是调用atoi(co[i]);
这是错误的,
注意它说int不是char。
例如:
atoi("1");
有效但atoi('1');
无效。
所以即使co
与"12345678"
相似,然后atoi(co)
正确,atoi(co[i])
也不正确。
答案 2 :(得分:1)
printf("%c = ",co[i]);
ci[i] = atoi(co[i]);
printf("%d \n",ci[i]);
您正在尝试将char转换为int,但char 是整数值。你所需要的只是
printf("%c = %d\n", co[i], co[i]);
如果你想要的是char的十进制值。如果你要做的是将ASCII数字转换为整数,那么
printf("%c = %d\n", co[i], co[i] - '0');
会做的。