我试图弄清楚为什么将一个char数组赋给一个int值,现在我在使用cast运算符时有点困惑。
我没有得到do语句中的内容,我希望有人可以解释
char *readword()
{
int c,i;
char t[255];
char *p;
//jump over chars who aren't letters
while ((c=getchar())<'A'|| (c>'Z' && c<'a') || c>'z')
if (c==EOF) return 0;
i=0;
do {
t[i++]=c;// shouldn't be like (char)c
} while ((c=getchar())>='A' && c<='Z' || c>='a' && c<='z');
//keep the word in heap memory
if ( c==EOF)
return 0;
t[i++]='\0';
if ((p=(char *)malloc(i))==0)
{
printf(" not enough memory\n");
exit(1);
}
strcpy(p,t);
return p;
}
答案 0 :(得分:3)
getchar()
函数返回int
类型;并且使用int来捕获getchar()
返回值非常重要。这是因为如果getchar()
失败,它将返回(int)(EOF)
(根据chux注释。当它成功返回时,它将返回一个适合{{{ 1}}。
问题代码是一次构建一个char
字符串或数组,一个char
:
char
上面的行可写:
t[i++]=c;
由于编译器自动转换第一种情况,这两种情况都适用。
答案 1 :(得分:1)
char
和int
的混合非常简单:EOF
旨在作为一个文件,可以区别于您从文件中读取的任何值。
为了支持这一点,您需要首先将文件中的数据读入大于char
的数据,这样它至少可以容纳一个不可能来自文件的值。他们为此目的选择的类型是int
。
因此,您从文件中读取了一个字符int
。您将其与EOF
进行比较,看看它是否真的是来自文件的角色。如果(并且仅当)您验证它确实来自文件,则将值保存到char
,因为您现在知道它真正代表的是什么。
那就是说,我现在认为代码非常糟糕。仅举一个特别明显的例子,您几乎肯定希望使用c<'A'|| (c>'Z' && c<'a') || c>'z')
代替isalpha(c)
类型的代码。
使用scanf
代替它也会容易得多。
答案 2 :(得分:0)
您可以将任何int值分配给char。仅使用最低8位。在传达你的意图方面,演员会更“正确” - 人们可能不会记得任何大于8位值的东西都会被截断,结果可能会出乎意料。
请注意,由于您没有说“unsigned char t [255]”,实际上您得到的是7位,而最重要的(第8位)将被解释为符号。例如,如果你要说
char t = 0xFF;
那么你实际上将-1分配给t。
如果您指定了数字&gt; 0xFF然后高于第8位的所有位都将被剥离。所以,如果你要说:
char t = 0x101;
实际上你得到了分配给t的值1。
有问题的代码是正确的,因为getchar()返回一个int而-1是一个错误值,因此检查它是很重要的。对于非错误情况,返回将适合8位字符。