Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用itoa()会导致:“引用”;赋值从整数生成指针,不带强制转换;_C_String_Type Conversion_Integer_Prototype - Fatal编程技术网

C 使用itoa()会导致:“引用”;赋值从整数生成指针,不带强制转换;

C 使用itoa()会导致:“引用”;赋值从整数生成指针,不带强制转换;,c,string,type-conversion,integer,prototype,C,String,Type Conversion,Integer,Prototype,我正在用C编写BCD(二进制编码的十进制),并负责编写不同的BCD函数 我需要将一个整数I编码到大小为n的缓冲区char*s中。函数在成功时返回0,在溢出时返回-1(编码i需要大于n的缓冲区) 下面是函数:intbcd\u编码(inti,intn,char*s) 以及一个示例输入:assert(bcd_encode(a,128,s)==0) 我正在为函数bcd_encode编写代码,如果我错了,请纠正我的错误,但我相信函数,并且只有当你有一些func(char x[])和charfunc(cha

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

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

下面是函数:
intbcd\u编码(inti,intn,char*s)

以及一个示例输入:
assert(bcd_encode(a,128,s)==0)

我正在为函数bcd_encode编写代码,如果我错了,请纠正我的错误,但我相信函数,并且只有当你有一些
func(char x[])
和char
func(char*x)
时,我才相信函数?因此,您可以将它们视为一个字符数组。如果它在函数定义
char x[]之外
将是一个字符数组和
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)

任何帮助都将不胜感激。提前谢谢

#包括
#include <stdlib.h>
如果没有包含,编译器对
itoa()
一无所知,并且会假设它返回
int

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

 #include < stdlib.h> 
#包括
如果未定义,编译器将假定未知函数itoa()返回int(出于愚蠢的历史原因)

始终听取编译器警告-它们是您的朋友

你说:

。。。如果我错了,请纠正我,但我相信函数,并且只有在函数中,如果你有一些func(char x[])和char func(char*x),它们是一样的东西?因此,您可以将它们视为一个字符数组。如果它在函数定义char x[]之外;将是一个char数组和char*x;将是一个指针

int bcd_encode(int i, int n, char *s){  
    int j = 0;  
    s = itoa(i, s, n+1);  
}
最好将它们都视为函数内部的指针(而不是都视为数组),但在函数参数列表中有关键点,数组和指针之间的区别很模糊,但在其他地方指针和数组是不同的

在代码中,由于假定
itoa()
在没有相反信息的情况下返回一个整数,因此不能将其存储在指针中或作为指针(不使用大锤转换,这将导致代码中断)

itoa()
返回什么?它不是标准的C函数(如中所示,不是在ISO/IEC 9899:1999中,也不是在POSIX中)。建议它不返回任何值,因此不应在任何位置赋值。将其作为
中的非标准扩展,并使用不同的接口返回
字符*
(这是其第二个参数的值)。您可以安全地忽略返回值;事实上,您也可以进行赋值(在包含标题之后),但赋值是不可操作的。您需要知道函数是非标准的,它有多种定义,因此您必须知道什么适合您的平台,或者避免使用它(可以改为使用
snprintf()


引用链接的Linux手册页面:

将整数转换为字符串

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

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

如果基数为10,val为负数,则在前面加一个减号

函数的作用是:返回作为s传递的指针

您不想使用
n+1
作为基数

函数在成功或失败时返回0 -1,以防溢出(编码i需要大于n的缓冲区)

但你没有这样做

int j=0

那是干什么用的

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

你为什么分配给s

我试过几种不同的变体 从

*s=itoa(i);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;  
}
#包括
intbcd_编码(inti,intn,char*s){
int r=snprintf(s,n,“%d”,i);
返回r
假设s应该以NUL结尾,而n包括NUL——这些细节在您的描述中没有指定


顺便说一句,这不是“BCD”的意思——请参见

也许您想在函数末尾返回一个
int
itoa
仅为MSVC++(AFAIK)。它不是标准的C。它不是标准的C,但它得到了广泛的应用。嗯,我有stdio.h,而不是stdlib,但是它仍然会出错(所以我会继续挖掘)。它不是标准的C,所以#include位置可能会有所不同。请参阅您的系统/编译器的文档。我一直在学习更多有关编译器错误的内容。即使我加了,它仍然给我同样的错误。。。我在想这是因为我的茶