我试图从键盘上读取2个变量并将它们写在屏幕上,但是我遇到了问题,该程序仅显示一个变量。
dist
我介绍了14和15,程序返回了我0和15 有人可以告诉我为什么吗?
答案 0 :(得分:2)
将%hd格式说明符用于短整数 将%hu格式说明符用于无符号int 将%d格式说明符用于int 对长整数使用%ld格式说明符
void take_client(int sock) { //sock live on stack here
pthread_t thread_id;
pthread_create(&thread_id, NULL, thread_func, (void*)&sock);
// you pass the stack address of sock to your thread
}
答案 1 :(得分:1)
scanf()
和printf()
中的格式化程序与变量n
和x
的类型不匹配。
%d
使用变量int
,而int
的字节数可能是short int
的两倍。 (Integer types)
因此,格式错误的scanf()
使用提供的地址是错误的。
对于printf()
来说有点复杂:short int
在内部转换为int
。 (Default argument promotions)因此,使用short int
(原为%d
)打印int
不会失败。
因此,必须修复scanf()
。 。
使用正确的格式化程序:
#include <stdio.h>
int main()
{
short int n,x;
scanf("%hd",&n);
scanf("%hd",&x);
printf("%d %d",n,x);
return 0;
}
或为格式化程序使用正确的变量类型:
#include <stdio.h>
int main()
{
int n,x;
scanf("%d",&n);
scanf("%d",&x);
printf("%d %d",n,x);
return 0;
}
scanf()
和printf()
系列的格式非常强大和灵活,但不幸的是也很容易出错。错误地使用它们会引入Undefined Behavior。 (通常)编译器无法识别错误,因为格式化程序的评估是在运行时以及在scanf()
/ printf()
函数内部进行的。因此,必须谨慎使用它们。
答案 2 :(得分:1)
expected
假定变量的数据类型为*this
。
使用数据类型expected
:
%d
或使用int
代替int
int main()
{
int n,x;
scanf("%d",&n);
scanf("%d",&x);
printf("%d %d",n,x);
return 0;
}
请注意,%hd
读取一个值并将其存储到%d
寻址的存储器中。由于int main()
{
short int n,x;
scanf("%hd",&n);
scanf("%hd",&x);
printf("%hd %hd",n,x);
return 0;
}
被视为4字节内存,因此会将4字节写入scanf("%d",&x);
指定的地址。