int main(int argc, char const *argv[]) { //初始化 int ret = __INIT__(); if(ret == -1) return -1; while(1) {//主界面 mmap_bmp("11.bmp",0,0,800,480); //获取坐标 get_touch(&th_x,&th_y); //判断坐标位置 if(th_x >= 100 && th_x < 200 && th_y >= 300 && th_y < 400) { //图片 pic(); } if(th_x >= 300 && th_x < 500 && th_y >= 300 && th_y < 400) { //音乐 music(); } if(th_x >= 600 && th_x < 700 && th_y >= 300 && th_y < 400) { //视频 video(); } }
时间: 2024-01-28 13:03:09 浏览: 31
这段代码看起来是一个简单的嵌入式界面程序。程序的主函数main中包含了一个无限循环,不断更新界面并获取触摸坐标,根据坐标位置判断用户点击了哪个菜单选项,然后进入相应的处理函数。其中,pic()、music()、video()应该是处理不同菜单选项的函数。
不过,这段代码中也存在一些问题。首先,它没有提供退出程序的方式,因为while(1)会一直运行下去,除非手动断电或者按复位按钮。其次,它没有保护界面刷新和触摸坐标获取的过程,这可能导致程序崩溃或者无法响应用户的操作。最后,这段代码中没有进行错误处理,例如打开图片、音乐、视频等资源失败的情况。
为了让程序更加健壮和可靠,建议您在程序中加入退出机制,使用信号量或互斥锁等方式保护共享资源,以及添加错误处理代码。
相关问题
将如下代码改成一个函数#include <string.h> #include <unistd.h> #include <sys/socket.h> #include <arpa/inet.h> #include <openssl/ssl.h> #include <openssl/err.h> #define MAX_BUF_SIZE 1024 int main(int argc, char *argv[]) { int sockfd, ret; char *url = argv[1]; // 输入的 url char *cert_path = argv[2]; // 输入的证书路径 struct sockaddr_in servaddr; SSL_CTX *ctx; SSL *ssl; char buf[MAX_BUF_SIZE]; // 初始化 SSL 库 SSL_library_init(); OpenSSL_add_all_algorithms(); SSL_load_error_strings(); // 创建 SSL 上下文 ctx = SSL_CTX_new(TLS_client_method()); if (ctx == NULL) { printf("SSL_CTX_new error.\n"); return -1; } // 加载证书 ret = SSL_CTX_load_verify_locations(ctx, cert_path, NULL); if (ret != 1) { printf("SSL_CTX_load_verify_locations error.\n"); return -1; } // 创建 socket sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { printf("socket error.\n"); return -1; } // 设置服务器地址 memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(443); inet_pton(AF_INET, url, &servaddr.sin_addr); // 连接服务器 ret = connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)); if (ret < 0) { printf("connect error.\n"); return -1; } // 创建 SSL 对象 ssl = SSL_new(ctx); if (ssl == NULL) { printf("SSL_new error.\n"); return -1; } SSL_set_fd(ssl, sockfd); // 建立 SSL 连接 ret = SSL_connect(ssl); if (ret != 1) { printf("SSL_connect error.\n"); return -1; } // 发送请求 char *request = "GET / HTTP/1.1\r\nHost: %s\r\n\r\n"; sprintf(buf, request, url); SSL_write(ssl, buf, strlen(buf)); // 接收响应 while (1) { memset(buf, 0, sizeof(buf)); ret = SSL_read(ssl, buf, sizeof(buf) - 1); if (ret < 0) { printf("SSL_read error.\n"); break; } else if (ret == 0) { break; } else { printf("%s", buf); } } // 关闭 SSL 连接 SSL_shutdown(ssl); SSL_free(ssl); // 关闭 socket close(sockfd); // 清理 SSL 上下文 SSL_CTX_free(ctx); return 0; }
好的,下面是将代码改写成一个函数的结果:
```
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
#define MAX_BUF_SIZE 1024
int https_request(const char *url, const char *cert_path) {
int sockfd, ret;
struct sockaddr_in servaddr;
SSL_CTX *ctx;
SSL *ssl;
char buf[MAX_BUF_SIZE];
// 初始化 SSL 库
SSL_library_init();
OpenSSL_add_all_algorithms();
SSL_load_error_strings();
// 创建 SSL 上下文
ctx = SSL_CTX_new(TLS_client_method());
if (ctx == NULL) {
printf("SSL_CTX_new error.\n");
return -1;
}
// 加载证书
ret = SSL_CTX_load_verify_locations(ctx, cert_path, NULL);
if (ret != 1) {
printf("SSL_CTX_load_verify_locations error.\n");
return -1;
}
// 创建 socket
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
printf("socket error.\n");
return -1;
}
// 设置服务器地址
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(443);
inet_pton(AF_INET, url, &servaddr.sin_addr);
// 连接服务器
ret = connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
if (ret < 0) {
printf("connect error.\n");
return -1;
}
// 创建 SSL 对象
ssl = SSL_new(ctx);
if (ssl == NULL) {
printf("SSL_new error.\n");
return -1;
}
SSL_set_fd(ssl, sockfd);
// 建立 SSL 连接
ret = SSL_connect(ssl);
if (ret != 1) {
printf("SSL_connect error.\n");
return -1;
}
// 发送请求
char *request = "GET / HTTP/1.1\r\nHost: %s\r\n\r\n";
sprintf(buf, request, url);
SSL_write(ssl, buf, strlen(buf));
// 接收响应
while (1) {
memset(buf, 0, sizeof(buf));
ret = SSL_read(ssl, buf, sizeof(buf) - 1);
if (ret < 0) {
printf("SSL_read error.\n");
break;
} else if (ret == 0) {
break;
} else {
printf("%s", buf);
}
}
// 关闭 SSL 连接
SSL_shutdown(ssl);
SSL_free(ssl);
// 关闭 socket
close(sockfd);
// 清理 SSL 上下文
SSL_CTX_free(ctx);
return 0;
}
```
函数名称为 `https_request`,接受两个参数,分别是 `url` 和 `cert_path`。函数返回值为整型,表示函数执行结果。在函数内部,我们使用了原始代码中的大部分代码,只是将 `main` 函数中的一些变量名做了一些修改,以符合函数的参数列表。
.编写一子函数,进行字符串解析 /* Internet address. */ struct in_addr { uint32_t s_addr; /* address in network byte order */ }; char *inet_ntoa(struct in_addr in); #include <sys/socket.h> #include <netinet/in.h> #include <netinet/ip.h> #include <arpa/inet.h> int main(int argc,const char * argv[]) { //argv[1]---"192.168.2.68" //argv[2]---"8888" struct sockaddr_in client;//通过网络获得客户端的地址 printf("客户端的IP地址:%S",inet_ntoa(client.sin_addr)); printf("端口号:%d\n",ntohs(client.sin_port)); return 0; } "zhangsan#123456#" "zhangsan" "123456" 参数:3个 参数1:你要解析的字符串 const char * 参数2:解析会获得用户名字符串char * 参数3:解析会获得密码字符串 char * 返回值:成功返回1,失败返回0 int parseStr(const char * str,char * username,char * pwd); int main(void) { char str[100]="zhangsan#123456#"; char username[20]; char pwd[20]; parseStr(str,username,pwd); printf("username=%s\npwd=%d\n",username,pwd); }
可以参考下面的代码实现:
```
#include <stdio.h>
#include <string.h>
int parseStr(const char *str, char *username, char *pwd) {
// 检查参数是否为空
if (str == NULL || username == NULL || pwd == NULL) {
return 0;
}
// 查找分隔符#
const char *p = strchr(str, '#');
if (p == NULL) {
return 0;
}
// 复制用户名字符串
int len = p - str;
strncpy(username, str, len);
username[len] = '\0';
// 复制密码字符串
strcpy(pwd, p+1);
// 返回成功
return 1;
}
int main(void) {
char str[100] = "zhangsan#123456#";
char username[20];
char pwd[20];
int ret = parseStr(str, username, pwd);
if (ret) {
printf("username=%s\npwd=%s\n", username, pwd);
} else {
printf("解析失败\n");
}
return 0;
}
```
解析函数 `parseStr` 接收一个字符串 `str`,以及两个指针 `username` 和 `pwd`,分别用于存储解析出来的用户名和密码字符串。函数首先检查参数是否为空,如果为空就返回 0 表示解析失败。然后函数查找分隔符 `#`,如果不存在就返回 0 表示解析失败。如果分隔符存在,就复制用户名字符串到 `username` 中,复制密码字符串到 `pwd` 中,并在最后返回 1 表示解析成功。
在主函数中,我们定义了一个字符串 `str`,包含了用户名和密码以及分隔符 `#`。然后我们调用 `parseStr` 函数进行解析,如果解析成功,就打印出用户名和密码。注意,这里的 `printf` 函数中,`pwd` 应该使用 `%s` 格式化字符串,而不是 `%d`。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)