所以我想出了一个主意,创建一个计算器,转换二进制十六进制和十进制数字,所以经过短暂的休息,以记住如何转换我开始我的代码在c和这是我卡住了:
#include <stdio.h>
#include <stdlib.h>
#define NULL ((char *)0)
int main() {
printf("Please choose one of the options:\n"
"for hexadecimal to binary enter xb\n"
"for binary to hexadecimal enter bx\n"
"for binary to decimal enter bd\n"
"for hexadecimal to decimal enter xd\n"
"for decimal to binary enter db\n"
"for decimal to hexadecimal enter dx\n");
char * input_user;
input_user = (char *) malloc(sizeof(char)*2);
scanf("%s2", input_user);
printf("%s", input_user);
switch (input_user) {
case xd:
printf("something");
break;
default:
printf("nothing");
break;
}
free(input_user);
}
当我将指针传递给交换机时,它会向我发送错误Statement requires expression of integer type ('char *' is invalid)
现在我不明白为什么当我传递input_user
时,它会抛出那个错误,但是如果我传递* input_user
,它会隐藏这个错误,input_user和 * input_user不一样吗?
(请记住,我是这个平台的新手,所以我不知道如何正确地在这里写问题)
我试图阅读更多关于开关在其他网站,但尚未找到一个很好的解释
3条答案
按热度按时间x9ybnkn61#
input_user
和* input_user
不一样吗?因为我声明了它。不,
* input_user
只引用已分配内存的第一个char
-一个char
,适合switch
。input_user
是一个指针-不适合switch
。sizeof(char)
始终为1,因此不需要sizeof(char) *
。如果要记录大小,请将大小记录到引用的对象,而不是类型。为简洁起见,未显示:检查分配是否成功。%s
always。检查返回值并与预期值进行比较。char
83qze16e2#
char * input_user;
是一个指针。switch(x)
需要一个整数值。1.您不能从
switch
中的字符串中进行选择,因为==
不比较字符串内容,仅比较引用(地址)。您需要使用strcmp
函数来比较它们和if
语句您可能希望从string的第一个字符开始切换
1.不要自己定义
NULL
。包含的头文件定义了它。在某些情况下可以在指针上使用大小写开关(例如在嵌入式开发中)
lpwwtiir3#
在这种情况下,信息只包含在两个字节中,可以使用宏来合并这两个字节,既可以来自用户的输入,也可以作为适合与
switch/case
一起使用的常量值。注意菜单选项的重新格式化。不要让你的用户感到困扰!