char数组是否等于int?

时间:2014-05-28 19:05:48

标签: c++ c arrays

我试图弄清楚为什么将一个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;
     } 

3 个答案:

答案 0 :(得分:3)

getchar()函数返回int类型;并且使用int来捕获getchar()返回值非常重要。这是因为如果getchar()失败,它将返回(int)(EOF) (根据chux注释。当它成功返回时,它将返回一个适合{{{ 1}}。

问题代码是一次构建一个char字符串或数组,一个char

char

上面的可写:

t[i++]=c;

由于编译器自动转换第一种情况,这两种情况都适用。

答案 1 :(得分:1)

charint的混合非常简单: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位字符。