求帮看一下,为什么这个返回值是乱码谢谢!
刚学的C,但是不对,望指正
char *a[3] ,b[3]; 都是sex() 函数里的局部变量,它们的生命周期随函数结束而结束,函数调用结束 a[] b[] 的空间均已释放,所以显示乱码了。看函数的写法,有形参 char * user_sex; 可以直接用来接受输入的字符串,而且不需要返回值了。修改如下,供参考:
#include <stdio.h>
#include <string.h>
void sex(char *user_sex)
{
do{
printf("请输入你的性别:");
scanf_s("%s", user_sex, 5);
if (strcmp(user_sex, "男") != 0 && strcmp(user_sex,"女") != 0)
printf("你这个帅哥,好好填!\n");
else
break;
} while (1);
}
int main()
{
char user_sex[5];
sex(user_sex);
printf("性别:%s", user_sex);
return 0;
}
目测你的代码不完整,而产生乱码的地方不在你图中的代码这里
不知道你这个问题是否已经解决, 如果还没有解决的话:/*
**数据域
*/
typedef struct
{
kal_uint8 bt_dpacket_data_total_num; //(可省略)数据项个数
kal_uint8 bt_dpacket_data_serial_num; //数据项编号
kal_uint8 bt_dpacket_data_len; //对应的数据项长度
kal_uint8 bt_dpacket_data_content[2]; //数据项内容
} STRUCT_BT_DPACKET_DATA;
/*
**蓝牙数据包解码出来的数据
**对应的结构体缓存字段,
*/
typedef struct
{
kal_uint8 bt_dpacket_decoder_type; //控制类型 1BYTE
kal_uint8 bt_dpacket_decoder_imei[8]; //IMEI 8BYTE
kal_uint8 bt_dpacket_decoder_ctrl_code; //控制码 1BYTE
kal_uint8 bt_dpacket_decoder_cmd; //命令码 1BYTE
kal_uint8 bt_dpacket_decoder_datalen[2]; //数据域长度 2BYTE
STRUCT_BT_DPACKET_DATA bt_dpacket_decoder_content; //数据域 5BYTE
kal_uint8 bt_dpacket_decoder_crc16[2]; //校验码 2BYTE
} STRUCT_BT_DPACKET_DECODER_DATA;
/*控制器类型对应编号*/
typedef enum
{
ctrler_begin = 0, //保留
ctrler_simple = 1, //普通定位
ctrler_high_precision = 2, //高精度定位
ctrler_simple_lock = 3, //普通定位+锁车
ctrler_high_precision_lock = 4, //高精度定位+锁车
ctrler_simple_lock_bt = 5, //普通定位+ 锁车
ctrler_high_precision_lock_bt = 6, //高精度定位+锁车+bt
ctrler_NUM_MAX
} enum_bt_diag_ctrler_type;
/*
*把字节流按照结构体样式解析出来
*返回结构体成员
*/
STRUCT_BT_DPACKET_DECODER_DATA* Track_cust_bt_dpacket_decoder
(
void* recv_data
)
{
kal_uint32 pre_index = 0;
kal_uint32 next_index = 0;
kal_uint8 *tem_recv_data = (kal_uint8*) recv_data;
STRUCT_BT_DPACKET_DECODER_DATA decoder_data_ex = {0};
STRUCT_BT_DPACKET_DECODER_DATA* decoder_data = &decoder_data_ex;
//kal_uint8 val[5] = {0};
kal_uint8 *data_content = (kal_uint8 *)malloc(sizeof(STRUCT_BT_DPACKET_DATA));
//kal_uint8 index_total_num = 0;
//kal_uint8 index_serial_num = 0;
//kal_uint8 index_data_len = 0;
if(data_content == NULL)
{
#if defined(TRACK_CUST_TRACE_BT_DPACKET)
LOGD(L_OS, L_V5, "%s,内存分配失败!", __FUNCTION__);
kal_prompt_trace(MOD_TST, "%s,内存分配失败!", __FUNCTION__);
#endif
return;
}
//控制器类型1BYTE
next_index = sizeof(decoder_data->bt_dpacket_decoder_type);
memcpy((kal_uint8*)(&(decoder_data->bt_dpacket_decoder_type)), (kal_uint8*)(tem_recv_data + pre_index), next_index);
pre_index += next_index;
#if defined(TRACK_CUST_TRACE_BT_DPACKET)
LOGD(L_OS, L_V5, "%s,decoder_data->bt_dpacket_decoder_type=%d", __FUNCTION__, \
decoder_data->bt_dpacket_decoder_type);
kal_prompt_trace(MOD_TST, "%s,decoder_data->bt_dpacket_decoder_type=%d", __FUNCTION__, \
decoder_data->bt_dpacket_decoder_type);
#endif
//IMEI 8BYTE
next_index = sizeof(decoder_data->bt_dpacket_decoder_imei);
memcpy(decoder_data->bt_dpacket_decoder_imei, (kal_uint8*)(tem_recv_data + pre_index), next_index);
pre_index += next_index;
#if defined(TRACK_CUST_TRACE_BT_DPACKET)
LOGD(L_OS, L_V5, "%s,decoder_data->bt_dpacket_decoder_imei=%d", __FUNCTION__, \
decoder_data->bt_dpacket_decoder_imei);
#endif
//控制码 1BYTE
next_index = sizeof(decoder_data->bt_dpacket_decoder_ctrl_code);
memcpy(&decoder_data->bt_dpacket_decoder_ctrl_code, (kal_uint8*)(tem_recv_data + pre_index), next_index);
pre_index += next_index;
#if defined(TRACK_CUST_TRACE_BT_DPACKET)
LOGD(L_OS, L_V5, "%s,decoder_data->bt_dpacket_decoder_ctrl_code=%d", __FUNCTION__, \
decoder_data->bt_dpacket_decoder_ctrl_code);
#endif
//命令码 1BYTE
next_index = sizeof(decoder_data->bt_dpacket_decoder_cmd);
memcpy(&decoder_data->bt_dpacket_decoder_cmd, (kal_uint8*)(tem_recv_data + pre_index), next_index);
pre_index += next_index;
#if defined(TRACK_CUST_TRACE_BT_DPACKET)
LOGD(L_OS, L_V5, "%s,decoder_data->bt_dpacket_decoder_cmd=%d", __FUNCTION__, \
decoder_data->bt_dpacket_decoder_cmd);
#endif
//数据域长度 2BYTE
next_index = sizeof(decoder_data->bt_dpacket_decoder_datalen);
memcpy(decoder_data->bt_dpacket_decoder_datalen, (kal_uint8*)(tem_recv_data + pre_index), next_index);
pre_index += next_index;
#if defined(TRACK_CUST_TRACE_BT_DPACKET)
LOGD(L_OS, L_V5, "%s,decoder_data->bt_dpacket_decoder_datalen=%d", __FUNCTION__, \
decoder_data->bt_dpacket_decoder_datalen);
#endif
//数据域 5BYTE
next_index = sizeof(decoder_data->bt_dpacket_decoder_content);
memcpy(data_content, (kal_uint8*)(tem_recv_data + pre_index), next_index);
//数据域结构体单独处理
decoder_data->bt_dpacket_decoder_content.bt_dpacket_data_total_num = \
data_content[0];
decoder_data->bt_dpacket_decoder_content.bt_dpacket_data_serial_num = data_content[1];
decoder_data->bt_dpacket_decoder_content.bt_dpacket_data_len = data_content[2];
memcpy(decoder_data->bt_dpacket_decoder_content.bt_dpacket_data_content, (kal_uint8*)(data_content + 3), \
sizeof(decoder_data->bt_dpacket_decoder_content.bt_dpacket_data_content));
pre_index += next_index;
#if defined(TRACK_CUST_TRACE_BT_DPACKET)
LOGD(L_OS, L_V5, "%s,decoder_data->bt_dpacket_decoder_content=%d", __FUNCTION__, \
decoder_data->bt_dpacket_decoder_content);
#endif
//校验码 2BYTE
next_index = sizeof(decoder_data->bt_dpacket_decoder_crc16);
memcpy(decoder_data->bt_dpacket_decoder_crc16, (kal_uint8*)(tem_recv_data + pre_index), next_index);
pre_index += next_index;
#if defined(TRACK_CUST_TRACE_BT_DPACKET)
LOGD(L_OS, L_V5, "%s,decoder_data->bt_dpacket_decoder_crc16=%d", __FUNCTION__, \
decoder_data->bt_dpacket_decoder_crc16);
#endif
free(data_content);
return decoder_data;
}
/*
** 解析蓝牙数据包ysheng
*/
STRUCT_BT_DPACKET_DECODER_DATA Track_cust_decode_bt_dpacket
(
void* recv_data
)
{
kal_uint32 recv_data_len = 0;
//STRUCT_BT_DPACKET_DECODER_DATA decoder_data_ex = {0};
STRUCT_BT_DPACKET_DECODER_DATA *decoder_data = NULL;//&decoder_data_ex;
BOOL crc16_ret = FALSE;
#if defined(TRACK_CUST_TRACE_BT_DPACKET)
LOGD(L_OS, L_V5, "Entry-->>%s", __FUNCTION__);
kal_prompt_trace(MOD_TST, "Entry-->>%s", __FUNCTION__);
#endif
//1.判断接收到的数据是否为空
if((kal_uint8*) recv_data == NULL)
{
#if defined(TRACK_CUST_TRACE_BT_DPACKET)
LOGD(L_OS, L_V5, "%s,recv_data为空!", __FUNCTION__);
kal_prompt_trace(MOD_TST, "%s,recv_data为空!", __FUNCTION__);
#endif
return;
}
/*2.先把数据解析出来,赋值给结构体变量*/
decoder_data = Track_cust_bt_dpacket_decoder((kal_uint8*)recv_data);
if(decoder_data == NULL)
{
#if defined(TRACK_CUST_TRACE_BT_DPACKET)
LOGD(L_OS, L_V5, "%s,decoder_data为空,数据解析出错!", __FUNCTION__);
kal_prompt_trace(MOD_TST, "%s,decoder_data为空,数据解析出错!", __FUNCTION__);
#endif
return;
}
/**3.crc16校验码,校验码是16位的话,
**则后两个字节为校验码
*/
//crc16_ret = IsCrc16Good((const U8*)(decoder_data->bt_dpacket_decoder_crc16),sizeof(decoder_data->bt_dpacket_decoder_crc16));
//if(!crc16_ret)
//{
#if defined(TRACK_CUST_TRACE_BT_DPACKET)
//LOGD(L_OS, L_V5, "%s,蓝牙诊断解析包crc16校验失败!",__FUNCTION__);
//kal_prompt_trace(MOD_TST, "%s,蓝牙诊断解析包crc16校验失败!",__FUNCTION__);
#endif
//return;
//}
/*4.判断控制器类型是否为
ctrler_simple_lock_bt
ctrler_high_precision_lock_bt
*/
if((decoder_data->bt_dpacket_decoder_type != ctrler_simple_lock_bt)\
&& (decoder_data->bt_dpacket_decoder_type != ctrler_high_precision_lock_bt)
)
{
#if defined(TRACK_CUST_TRACE_BT_DPACKET)
LOGD(L_OS, L_V5, "%s,蓝牙诊断:终端不支持蓝牙功能!", __FUNCTION__);
kal_prompt_trace(MOD_TST, "%s,蓝牙诊断:终端不支持蓝牙功能!", __FUNCTION__);
#endif
return;
}
/*5.判断命令码是否为01H或者02H,
因为蓝牙只有这两种任务序号*/
if(decoder_data->bt_dpacket_decoder_cmd != 1\
&& decoder_data->bt_dpacket_decoder_cmd != 2
)
{
#if defined(TRACK_CUST_TRACE_BT_DPACKET)
LOGD(L_OS, L_V5, "%s,蓝牙诊断:无此任务序号!", __FUNCTION__);
kal_prompt_trace(MOD_TST, "%s,蓝牙诊断:无此任务序号!", __FUNCTION__);
#endif
return;
}
/*其余解析出来的参数,
**暂时不在这里面判断了!
**注意,APP发送过来的包数据域的数据内容为应该为空
*/
return *decoder_data;
}
/*将结构体转化为字节流
**输入:packet_data
**输出:sendData
*/
void Track_cust_bt_dpacket_encoder(
kal_uint8 *sendData,
STRUCT_BT_DPACKET_DECODER_DATA *packet_data
)
{
kal_uint8 pre_index = 0;
kal_uint8 next_index = 0;
//kal_uint8 tmp_content[5] = {0};
//kal_uint8 *data_content = tmp_content;
kal_uint8 *data_content = (kal_uint8 *)malloc(sizeof(STRUCT_BT_DPACKET_DATA));
if(data_content == NULL)
{
#if defined(TRACK_CUST_TRACE_BT_DPACKET)
LOGD(L_OS, L_V5, "%s,内存分配失败!", __FUNCTION__);
kal_prompt_trace(MOD_TST, "%s,内存分配失败!", __FUNCTION__);
#endif
return;
}
//1.控制器类型打包 1B
next_index = sizeof(packet_data->bt_dpacket_decoder_type);
memcpy(sendData + pre_index, (kal_uint8*)(&(packet_data->bt_dpacket_decoder_type)), next_index);
pre_index += next_index;
#if defined(TRACK_CUST_TRACE_BT_DPACKET)
LOGD(L_OS, L_V5, "%s,packet_data->bt_dpacket_decoder_crc16=%d", __FUNCTION__, \
packet_data->bt_dpacket_decoder_crc16);
#endif
//2.IMEI 8B
next_index = sizeof(packet_data->bt_dpacket_decoder_imei);
memcpy(sendData + pre_index, (kal_uint8*)(packet_data->bt_dpacket_decoder_imei), next_index);
pre_index += next_index;
#if defined(TRACK_CUST_TRACE_BT_DPACKET)
LOGD(L_OS, L_V5, "%s,packet_data->bt_dpacket_decoder_imei=%d", __FUNCTION__, \
packet_data->bt_dpacket_decoder_imei);
#endif
//3.控制码 1B
next_index = sizeof(packet_data->bt_dpacket_decoder_ctrl_code);
memcpy(sendData + pre_index, (kal_uint8*)(&(packet_data->bt_dpacket_decoder_ctrl_code)), next_index);
pre_index += next_index;
#if defined(TRACK_CUST_TRACE_BT_DPACKET)
LOGD(L_OS, L_V5, "%s,packet_data->bt_dpacket_decoder_ctrl_code=%d", __FUNCTION__, \
packet_data->bt_dpacket_decoder_ctrl_code);
#endif
//4.命令码 1B
next_index = sizeof(packet_data->bt_dpacket_decoder_cmd);
memcpy(sendData + pre_index, (kal_uint8*)(&(packet_data->bt_dpacket_decoder_cmd)), next_index);
pre_index += next_index;
#if defined(TRACK_CUST_TRACE_BT_DPACKET)
LOGD(L_OS, L_V5, "%s,packet_data->bt_dpacket_decoder_ctrl_code=%d", __FUNCTION__, \
packet_data->bt_dpacket_decoder_ctrl_code);
#endif
//5.数据长度 1B
next_index = sizeof(packet_data->bt_dpacket_decoder_datalen);
memcpy(sendData + pre_index, (kal_uint8*)packet_data->bt_dpacket_decoder_datalen, next_index);
pre_index += next_index;
#if defined(TRACK_CUST_TRACE_BT_DPACKET)
LOGD(L_OS, L_V5, "%s,packet_data->bt_dpacket_decoder_datalen=%d", __FUNCTION__, \
packet_data->bt_dpacket_decoder_datalen);
#endif
//6.数据域5B
next_index = sizeof(packet_data->bt_dpacket_decoder_content);
data_content[0] = packet_data->bt_dpacket_decoder_content.bt_dpacket_data_total_num;
data_content[1] = packet_data->bt_dpacket_decoder_content.bt_dpacket_data_serial_num;
data_content[2] = packet_data->bt_dpacket_decoder_content.bt_dpacket_data_len;
memcpy((kal_uint8*)(data_content + 3), (kal_uint8*)packet_data->bt_dpacket_decoder_content.bt_dpacket_data_content, \
sizeof(packet_data->bt_dpacket_decoder_content.bt_dpacket_data_content));
memcpy(sendData + pre_index, (kal_uint8*)data_content, next_index);
pre_index += next_index;
#if defined(TRACK_CUST_TRACE_BT_DPACKET)
LOGD(L_OS, L_V5, "%s,packet_data->bt_dpacket_decoder_content=%d", __FUNCTION__, \
packet_data->bt_dpacket_decoder_content);
#endif
//7.校验码5B
next_index = sizeof(packet_data->bt_dpacket_decoder_crc16);
memcpy(sendData + pre_index, (kal_uint8*)packet_data->bt_dpacket_decoder_crc16, next_index);
pre_index += next_index;
#if defined(TRACK_CUST_TRACE_BT_DPACKET)
LOGD(L_OS, L_V5, "%s,packet_data->bt_dpacket_decoder_crc16=%d", __FUNCTION__, \
packet_data->bt_dpacket_decoder_crc16);
#endif
free(data_content);
return;
}
/*
** 封装蓝牙数据包,
** 将结构体转为字节流
** ysheng
*/
kal_uint8 * Track_cust_encode_bt_dpacket(
STRUCT_BT_DPACKET_DECODER_DATA *packet_data)
{
kal_uint8 len = sizeof(STRUCT_BT_DPACKET_DECODER_DATA);
kal_uint8 tem_send_data[20] = {0};
//函数返回指针的话,不能用动态分配内存...
kal_uint8 *sendData = tem_send_data;//(kal_uint8*)malloc(len);
#if defined(TRACK_CUST_TRACE_BT_DPACKET)
LOGD(L_OS, L_V5, "Entry-->>%s", __FUNCTION__);
kal_prompt_trace(MOD_TST, "Entry-->>%s", __FUNCTION__);
#endif
//格式化打包
Track_cust_bt_dpacket_encoder(sendData, packet_data);
/*以下判断senddata是否有效数据包,
**且是否加包头保卫及crc16编码
*/
{
//crc16编码
}
//free(sendData);
return sendData;
}
void main(void)
{
int i, val = 0;
STRUCT_BT_DPACKET_DECODER_DATA tmp_data = {0};
kal_uint8 *tem_send_data = 0;
kal_uint8 recv_data[20] =
{
0x05, // 控制器类型
//05 23 43 26 78 34 98 26 开头0需要特殊处理
0x05, 0x17, 0x2b, 0x1a, 0x4e, 0x22, 0x62, 0x1a, //IMEI
0x86, //控制码
0x01, //命令码01/02
0x00, 0x67, //数据长度103
0x01, //数据项个数
0x01, //数据项编号
0x03, //数据项长度
0x00, 0x01, //数据项内容
0xac, 0xd2 //crc16
};
//接口验证
tmp_data = Track_cust_decode_bt_dpacket(recv_data);
tem_send_data = Track_cust_encode_bt_dpacket(&tmp_data);
for(i = 0; i < 20; i++)
{
val = tem_send_data[i];
}
}
针对第一个问题:char函数返回的值出现乱码,怎么解决?
如果char函数返回的值出现乱码,可能是由于使用%s输出char类型变量造成的,应该使用%c输出。另外,如果输入的是中文字符,需要使用wchar_t类型代替char类型,并使用wprintf函数输出。
示例代码:
#include <stdio.h>
char fun() {
return 'a';
}
int main() {
printf("%c", fun()); // 输出:a
return 0;
}
针对第二个问题:要求写一个函数,实现,输入一个char,然后经过一系列的位变换,输出一个newChar
可以按照以下步骤实现该函数:
定义函数 char changeChar(void),不接收参数,返回值为 char 类型;
输入一个 char 型变量 ch,以及一个长度为 7 的 int 数组 str 用于保存 ch 的二进制表示,和一个长度为 7 的 int 数组 newStr 用于保存变换后的二进制数;
将 ch 中的每一位分离到 str 数组中;
对原有的每一位进行按要求的具体操作;
将新的位变换后的 newStr 数组转换成 char,用变量 newChar 存储;
输出 newChar 的二进制表达,以及对应的十进制值;
返回 newChar。
示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
char changeChar(void) {
char ch = 0 ;
char newChar = 0;
char temp[7];//临时变量
printf("请输入 ch:");
scanf("%d",&ch);
itoa(ch,temp,2);
printf("原来的 ch 的二进制:%s\n",temp);
int str[7];
//将 char 中的每一位分离到 str 数组中
for (int j = 0; j < 7; j++) {
//化成二进制时,从右数是第几位就像右边移动几位(注意:下标从零开始)然后在与上1
str[j] = (ch >> j) & 1; //移位操作符
}
int newStr[7];
//对原有的每一位进行按要求的具体操作
//根据要求不同,可以有不同的变换
newStr[0] = str[1];
newStr[1] = str[0];
newStr[2] = str[3];
newStr[3] = str[4];
newStr[4] = str[5];
newStr[5] = str[2];
newStr[6] = str[6];
//将新的位变换后的转变成 char
for (int k = 0; k <= 7; k++) {
newChar = newChar + newStr[k] * pow(2, k);
}
itoa(newChar,temp,2);
printf("newChar 的二进制表达:%s\n",temp);
printf("newChar:%d\n",newChar);
return newChar; //范围 newChar
}
int main() {
printf("%c", changeChar());
return 0;
}
针对第三个问题:字符 char
如果需要存储一个字符,可以使用 char 类型,它使用单引号括起来。
如果需要存储一个字符串,可以使用 char 类型的数组,即 char str[],它使用双引号括起来表示。
示例代码:
#include <stdio.h>
int main() {
char ch = 'A'; // 存储字符 A
char str[] = "Hello World!"; // 存储字符串 Hello World!
printf("%c\n", ch);
printf("%s\n", str);
return 0;
}
针对第四个问题:采取返回值(char 型)
函数如果需要返回一个字符类型的结果,可以将函数的返回值类型设为 char,然后在函数内部使用 return 返回一个字符即可。
示例代码:
#include <stdio.h>
char Iswin(char board[3][3]) {
//1.判断输赢
if (board[0][0] == '*' && board[0][1] == '*' && board[0][2] == '*')
return '*';
else if (board[0][0] == '#' && board[0][1] == '#' && board[0][2] == '#')
return '#';
else if (board[1][0] == '*' && board[1][1] == '*' && board[1][2] == '*')
return '*';
else if (board[1][0] == '#' && board[1][1] == '#' && board[1][2] == '#')
return '#';
else if (board[2][0] == '*' && board[2][1] == '*' && board[2][2] == '*')
return '*';
else if (board[2][0] == '#' && board[2][1] == '#' && board[2][2] == '#')
return '#';
else if (board[0][0] == '*' && board[1][1] == '*' && board[2][2] == '*')
return '*';
else if (board[0][0] == '#' && board[1][1] == '#' && board[2][2] == '#')
return '#';
//2.判断平局
int flag = 0;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (board[i][j] == ' ') {
flag = 1;
break;
}
}
}
if (flag == 0)
return 'Q';
//3.游戏继续
return 'c';
}
int main() {
char board[3][3] = { {' ', ' ', ' '}, {' ', ' ', ' '}, {' ', ' ', ' '} };
char result = Iswin(board);
printf("%c", result);
return 0;
}