我非常了解红宝石,并从一些玩具程序开始教我自己。这个只是计算我作为参数输入的一串数字的平均值。
#include <stdio.h>
#include <string.h>
main(int argc, char *argv[])
{
char *token;
int sum = 0;
int count = 0;
token = strtok(argv[1],",");
while (token != NULL)
{
count++;
sum += (int)*token;
token = strtok(NULL, ",");
}
printf("Avg: %d", sum/count);
printf("\n");
return 0;
}
输出结果为:
mike@sleepycat:~/projects/cee$ ./avg 1,1
Avg: 49
显然需要进行一些调整。
任何改进和解释都将不胜感激。
答案 0 :(得分:5)
将sscanf
或atoi
作为函数从字符串(字符数组)转换为整数。
与高级语言不同,C不会自动在字符串和整数/实数数据类型之间进行转换。
答案 1 :(得分:3)
49是'1'char的ASCII值。
它应该对你有帮助....:D
答案 2 :(得分:3)
问题是字符“1”是49.你必须将字符值转换为整数然后平均。
答案 3 :(得分:3)
在C中,如果您将char
投射到int
,则只需获得ASCII的值。所以,你将角色1的ascii值平均两次,得到你期望的结果。
您可能想要使用atoi()
。
编辑:请注意,这通常适用于C中的所有类型转换.C不会为您重新解释值,它相信您知道给定位置存在什么。
答案 4 :(得分:3)
的strtok(
请不要使用这个。即使是自己的文档也说不要使用它。作为Ruby程序员,我不知道你是如何发现它的存在的,但请忘记它。
(int)*token
这甚至不能满足您的需求。有两个基本问题:
1)char *不包含“文本”。它指向文本。 token
的类型为char*
;因此*token
的类型为char
。也就是说,一个字节,而不是一个字符串。请注意,我说的是“字节”,而不是“字符”,因为名称char
实际上是错误的 - 这是语言设计者可以理解的疏忽,因为当时不存在Unicode。请理解char
基本上是数字类型。 C中有没有真实文本类型!将一系列char
值解释为文本只是一种约定。
2)用C语言进行投射不会进行任何神奇的转换。
您的代码所做的是获取token
指向的字节(在strtok()
调用之后),并将数值强制转换为int。使用符号1
呈现的字节实际上具有值49.再次,将字节序列解释为文本只是一种约定,因此将字节解释为字符只是一种约定 - 具体来说,这里我们正在使用称为ASCII的约定。当您按下键盘上的1
键,然后按Enter键运行程序时,命令窗口启动的事件链实际上会将值为49的字节传递给您的程序。 (以同样的方式,逗号的值为44。)
通过使用适当的工具来解析输入,可以解决上述两个问题。查看sscanf()
。但是,你甚至不希望以这种方式将输入传递给你的程序,因为你不能在输入中添加任何空格 - 命令行中的每个“word”都将作为一个传递在argv []数组中单独输入。
事实上,你应该做的是利用,只需要期望argv []中的每个条目代表一个数字。您可以再次使用sscanf()
来解析每个条目,这将更容易。
最后:
printf(“平均值:%d”,总和/计数)
商sum/count
不会给出小数结果。将整数除以另一个整数会产生一个C整数,丢弃余数。
答案 5 :(得分:2)
您无法通过
将字符串转换为整数sum += (int)*token;
相反,你必须调用像atoi()
这样的函数:
sum += atoi (token);
答案 6 :(得分:2)
在这一行:sum += (int)*token;
将 char 转换为 int 会获取 char 的ASCII值。为1,此值为49。
使用 atoi 功能代替:
sum += atoi(token);
注意 atoi 位于stdlib.h
文件中,因此您还需要 #include 。
答案 7 :(得分:1)
当你将一个char(这是*令牌)转换为int时,你得到它在C中的ascii值 - 这是49 ...所以字符ascii值的平均值实际上是49.你需要使用atoi获取代表的数字的值