C整数与字符之间的兼容性
C如何处理整数和字符之间的转换?假设我们已经声明了一个整数变量,并要求用户输入数字,但他们却输入了一个字符串。会发生什么?
解决方案
该程序将崩溃,我们需要调用atoi函数。
嗯?
我们总是输入一个字符串。然后,我们可以使用各种方式(再次询问,采用默认值等)解析该字符串为数字,以处理各种错误(溢出,不正确的字符等)。
用户输入被视为需要使用atoi或者其他转换函数转换为int的字符串。如果该字符串不能包含数字,因为它包含字母或者其他非数字字符,则Atoi将返回0。
我们可以在MSDN上的atoi文档上了解更多信息,网址为http://msdn.microsoft.com/zh-cn/library/yd5xkb5c(VS.80).aspx
要注意的另一件事是,在C中,字符和整数在某种程度上是"兼容的"。可以将任何字符分配给一个int。反之亦然,但是如果整数值不适合char,我们将丢失信息。
char foo = 'a'; // The ascii value representation for lower-case 'a' is 97 int bar = foo; // bar now contains the value 97 bar = 255; // 255 is 0x000000ff in hexadecimal foo = bar; // foo now contains -1 (0xff) unsigned char foo2 = foo; // foo now contains 255 (0xff)
正如其他人所指出的那样,数据通常以字符串形式输入-唯一的问题是使用哪个函数进行读取。如果使用的是GUI,则该函数可能已经以适当的方式处理了到整数的转换和报告错误的问题。如果我们使用的是Standard C,通常更容易将值读入字符串中(也许使用fgets()
然后进行转换。尽管可以使用" atoi()`"),但这并不是最佳选择;问题在于确定转换是否成功(并由于用户输入了合法的零表示而产生了零)。
通常,使用strtol()
或者其亲戚之一(strtoul()
,strtoll()
,strtoull()
);要转换浮点数,请使用strtod()
或者类似的函数。整数转换例程的优点包括:
- 可选的基数选择(例如,以10为基数或者以10为基数的十六进制,或者以8为基数的八进制,或者使用标准C约定的上述任意一种(八进制为007,十六进制为0x07,十进制为7)。
- 可选的错误检测(通过了解转换在哪里停止)。
在其中很多功能规范中,我去的地方(当我不看实际的C标准副本时)是POSIX网站(其中包括C99函数)。它以Unix为中心,而不是以Windows为中心。