代码在输出C上无法正常工作

时间:2018-10-14 09:02:41

标签: c

我试图从键盘上读取2个变量并将它们写在屏幕上,但是我遇到了问题,该程序仅显示一个变量。

dist

我介绍了14和15,程序返回了我0和15 有人可以告诉我为什么吗?

3 个答案:

答案 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()中的格式化程序与变量nx的类型不匹配。

%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;
}

Live Demo on ideone

或为格式化程序使用正确的变量类型:

#include <stdio.h>

int main()
{
    int n,x;
    scanf("%d",&n);
    scanf("%d",&x);
    printf("%d %d",n,x);
    return 0;
}

Live Demo on ideone

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);指定的地址。