C新手:我的计划有什么问题?

时间:2010-12-01 00:53:40

标签: c

我非常了解红宝石,并从一些玩具程序开始教我自己。这个只是计算我作为参数输入的一串数字的平均值。

#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

显然需要进行一些调整。

任何改进和解释都将不胜感激。

8 个答案:

答案 0 :(得分:5)

sscanfatoi作为函数从字符串(字符数组)转换为整数。

与高级语言不同,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获取代表的数字的值