2011-02-08 75 views
1

我正在C中编写BCD(二进制编码的十进制)并负责编写不同的bcd函数。C中的BCD(二进制编码的十进制)

我需要将整数i编码到大小为n的缓冲区char * s中。该函数在成功时返回0,在溢出情况下返回-1(编码i需要大于n的缓冲区)。

下面是函数:int bcd_encode(int i, int n, char *s)

和样本输入:assert(bcd_encode(a, 128, s) == 0);

我写的代码功能bcd_encode并纠正我,如果我错了,但我相信,在一个函数,只在函数如果你有一些func(char x[])和字符func(char *x)他们会是同样的事情?所以你可以将它们看作一个char数组。如果它在函数定义之外char x[];将是一个char数组,并且char *x;将是一个指针。

int bcd_encode(int i, int n, char *s){ 
    int j = 0; 
    s = itoa(i, s, n+1); 
} 

但是,这会返回一个警告“赋值使指针从整型不带转换”和一个未定义的itoa符号。我已经尝试了几种不同的变体,从

* s = itoa(i); s = itoa(i); s = itoa(i,s,n + 1);

任何帮助,将不胜感激。提前致谢!

+0

也许你想在函数的最后返回一个`int`? – Peyman 2011-02-08 00:53:46

+1

`itoa`仅适用于MSVC++(AFAIK)。这不是标准C. – 2011-02-08 00:54:29

+1

这不是标准的C,但它被广泛实施。 – payne 2011-02-08 01:12:09

回答

1

你说:

...并纠正我,如果我错了,但我相信在一个函数,只有在一个功能,如果你有一些FUNC(焦X [])和炭FUNC (char * x)他们会是同一件事?所以你可以将它们看作一个char数组。如果它在函数定义之外char x [];将是一个char数组和char * x;将是一个指针。

倒不如把它们既作为指针(而不是两个数组)的函数里面,但你的关键点 - 在函数参数列表,数组和指针之间的区别是模糊的,但其他地方的指针和数组是不同的。

在代码中,由于假设itoa()在没有信息的情况下返回一个整数,所以不能将它存储在指针或指针中(不使用大锤投影,这会使代码断开) 。

itoa()返回什么?它不是标准的C函数(如在,不在ISO/IEC 9899:1999中,也不在POSIX中)。Wikipedia建议它不返回任何值,所以你不应该在任何地方分配它的值。 Linux将它作为<stdlib.h>中的非标准扩展,使用不同的接口返回char *(这是它的第二个参数的值)。你可以放心地忽略返回值;实际上,您也可以执行分配(在包含标题后),但分配是无操作的。您需要知道该功能是非标准的,它有多种定义,因此您必须了解平台的正确性,或避免使用它(可以使用snprintf()代替)。


引用链接的Linux手册页:

char* itoa (int __val, char * __s, int __radix) 

转换为字符串的整数。

函数itoa()将val中的整数值转换为将存储在s下的ASCII表示形式。调用者负责提供足够的存储空间。

注:
缓冲S的最小尺寸取决于基数的选择。例如,如果基数为2(二进制),则需要提供最小长度为8 * sizeof(int)+ 1个字符的缓冲区,即每个位一个字符加一个字符串终止符。使用更大的基数将需要更小的最小缓冲区大小。 警告:
如果缓冲区太小,可能会导致缓冲区溢出。 转换使用基数作为基数,可能是2(二进制转换)和最多36之间的数字。如果基数大于10,则'9'后面的下一个数字将是字母'a'。

如果基数为10,val为负值,则会预设一个负号。

itoa()函数返回以s传递的指针。

你不想用n+1作为基数。

1
#include <stdlib.h> 

没有包括,编译器不知道什么itoa()并将承担其返回int

+0

嗯我有stdio.h不是stdlib但它仍然没有错误(所以我会继续挖) – Grant 2011-02-08 01:03:48

+0

它不是标准的C,所以#include的位置可能会有所不同。请参阅您的系统/编译器的文档。 – payne 2011-02-08 01:12:33

0

itoa()是未定义意味着你缺少的头文件

#include < stdlib.h> 

如果它没有定义,编译器假设未知函数itoa()返回一个int(笨历史原因)。

总是听编译器警告 - 他们是你的朋友!

1

该函数返回0成功或 -1溢出的情况下(其编码i需要一个缓冲器大于n)。

但你并没有这样做。

int j = 0;

那是什么?

s = itoa(i,s,n + 1);

你为什么分配给s?

我已经从

* S = itoa(ⅰ)尝试了几种不同的变化 ; s = itoa(i); s = itoa(i,s,n + 1);

随机尝试事情,直到你偶然发现一个工作不是一个好的编程方法。

指定为s或* s在这里不合适,并且显示对C的理解不足;我强烈建议在语言中获得更多的指导。一旦你这样做,你可以使用的snprintf,例如,

#include <stdio.h> 
int bcd_encode(int i, int n, char *s){ 
    int r = snprintf(s, n, "%d", i); 
    return r < n? 0 : -1; 
} 

假设S是应该是NUL结束,并且n包括的NUL - 在你的描述中未作规定的细节。

顺便说一句,这不是什么“BCD”是指 - 见http://en.wikipedia.org/wiki/Binary-coded_decimal

相关问题