使用scanf和赋值读取变量之间的区别

问题描述:

int main() 
{ 
    int i,j; 
    i='c'; 

    scanf("%d",&j); // I will read 'c' here 

    printf("%d %d",i,j); 

} 

输出不相同。 'j'需要垃圾值,'i''c'的ascii值。有人可以告诉可能是什么原因吗?使用scanf和赋值读取变量之间的区别

+0

http://c-faq.com/stdio/scanf1a.html – 2010-08-22 12:56:48

scanf说:

scanf("%d", &j); 

有这样一句话scanf将尝试解析(转换)要用作输入功能的“C”字符为数字。这就是你得到垃圾。 C不知道如何将'c'变成数字,因为scanf正在等待数字。

尝试改变,为:

scanf("%c", &j); 

如果您的通话printf是这样的:

printf("%d %d", i, j); 

你应该得到相同的值,这两个时间: 'C' 字符的ASCII值。

+0

但我的目的是知道将字符赋值给整型变量和将字符读入使用scanf的整型变量之间的区别。 – Jagan 2010-08-22 12:54:50

+0

我明白了。但为了**将字符**读入整型变量,您需要使用%c而不是%d。请记住,scanf不是一个赋值函数,它是一个解析函数(它会尝试将字符串转换为变量表示的值,并且你的%修饰符会告诉它)。 – 2010-08-22 12:58:49

+1

这是不正确的。他只会在'j'的低字节处得到'99'(''c''的整数值),剩下的就是垃圾 – 2010-08-22 13:04:27

这里有两个问题。

首先,您打电话scanf%d。这意味着scanf将查找十进制字符并将其放入j。它不会找到任何东西,所以它会保持j不变。

您需要做的第一件事是将%d更改为%c

现在你还有另一个问题。 jint,但您正在阅读char。 A char通常比int小。通常char是8位,而int是32或64位。现在将发生的是,scanf将把'c'的ASCII值放入j的低位字节,但保留其余的不变。

您需要可以清除掉j明确:

int j = 0; 

或声明为一个字符:

char j; 

这说明分配int或使用scanf之间的差异。函数scanf不知道j是int。它猜测根据格式字符串发送了什么指针。当您使用%c格式,你告诉scanf治疗&j作为一个指向字符,而如果你明确地

j = 'c'

分配给它的编译器知道'c'charjint,并且会为你做正确的转换,包括清零高位。

+0

我将j初始化为0.但是在读入'j'到'j'之后,我得到0作为输出。但是我应该得到99. – Jagan 2010-08-22 13:01:01

+0

@Jagan:但是你也必须将'%d'更改为'%c' – 2010-08-22 13:03:27

你并没有真正阅读任何东西到j。我的猜测是,j将由您的编译器进行零初始化,并输出0.由于我们真的不知道您实际打印出的j是什么 - 我们只能假设是这种情况。在你的另一个例子中,我可能会打印'c'的ascii值为99.如果你想将一个字符读入j,那么你还需要将%d改为%c。但我的猜测是你真的不打算使用j,它会被我替换,所以你可以比较不同之处。

+0

'j'不一定是零初始化的。大多数编译器根本不能保证。事实上,他有垃圾,因为'j'没有初始化。如果他在代码中没有改变任何东西*除了在scanf之前清零'j',那么他将打印出'0'。 – 2010-08-22 13:02:43

+0

@Nathan:尽管我同意他仍然有可能明确地初始化,因为他可能留下了垃圾值。我们真的不知道他的输出(坦率地说,因为这个问题措辞不够完整) – 2010-08-22 13:40:06

+0

垃圾意味着垃圾。那就是,不是''c''。 – 2010-08-22 13:41:46