static char* strtrim(char* in) { char* ps = in; char* pe = in + strlen(in) - 1; while (*ps && (unsigned char)*ps <= 32) { ps++; } while (ps <= pe && (unsigned char)*pe <= 32) { pe--; } *(pe + 1) = '\0'; strcpy(in, ps); return in; }
时间: 2024-04-28 08:26:22 浏览: 53
这段代码是用来去除字符串两端的空格或空白字符的函数。它首先找到字符串开头和结尾的非空格或非空白字符的位置,然后把中间的部分复制到原始字符串的首部,最后在末尾添加一个字符串结束符 '\0'。最后返回的是修改后的原始字符串的指针。
需要注意的是,该函数会直接修改原始字符串。如果需要保留原始字符串,应该先复制一份再进行操作。另外,该函数只能去除两端的空格或空白字符,不能去除字符串中间的空格或空白字符。
相关问题
void send_client_info(char *str) { int i; static char *pstr = NULL; static int len = 128; if (!str || strlen(str) == 0) { return; } if (!pstr) { pstr = (char *)malloc(len); } if (strlen(str) + 2 > (size_t) len) { free(pstr); len *= 2; pstr = (char *)malloc(len); } strcpy(pstr, str); strcat(pstr, "\n"); if (icon_mode_fh) { if (0) fprintf(icon_mode_fh, "\n"); fprintf(icon_mode_fh, "%s", pstr); fflush(icon_mode_fh); } for (i=0; i<ICON_MODE_SOCKS; i++) { int len, n, sock = icon_mode_socks[i]; char *buf = pstr; if (sock < 0) { continue; } len = strlen(pstr); while (len > 0) { if (0) write(sock, "\n", 1); n = write(sock, buf, len); if (n > 0) { buf += n; len -= n; continue; } if (n < 0 && errno == EINTR) { continue; } close(sock); icon_mode_socks[i] = -1; break; } } }
这段代码定义了一个名为send_client_info的函数,它接收一个字符串参数str,并将其发送到多个客户端。下面是函数的具体实现:
1. 首先检查str是否为空或长度为0,如果是,则直接返回。
2. 如果pstr为空,则分配一个长度为128的缓冲区。
3. 如果str的长度+2大于缓冲区长度,则重新分配一个长度为原长度两倍的缓冲区。
4. 将str复制到缓冲区中,并在其末尾添加一个换行符。
5. 如果icon_mode_fh不为空,则向其写入一个换行符,并将缓冲区内容写入文件中。
6. 遍历所有的客户端socket,向它们发送缓冲区内容,如果发送失败,则关闭该socket,并将其标记为无效。
需要注意的是,这段代码中还有一些调试用的if语句,如第23行和第37行,可以忽略。
解析以下代码流程void upDisplayData(char *str){ char *p= NULL; unsigned int len = 0; int i; unsigned char local = 0; unsigned char err[] = {"data too large"}; static unsigned char showString[30] = {' '}; len = strlen(str); for(i = 0; i < len; i++) { if(str[i] == '\n') { local = i; } } if(local > 0) { if((local < 30)) { memset(showString,32,30); memcpy(showString,str,local); LCD_ShowString(30,100,200,16,16,showString); if((len-local) < 30) { memset(showString memcpy(showString,str+local+1,len-local-1); LCD_ShowString(30,120,200,16,16,showString); } else { LCD_ShowString(30,120,200,16,16,err); } } else { LCD_ShowString(30,100,200,16,16,err); } } else { if(len < 30) { memset(showString,32,20);//32 memcpy(showString,str,len); LCD_ShowString(30,100,200,16,16,showString); } else { LCD_ShowString(30,100,200,16,16,err); } }} static int process_command_call(char *ptag, char *pval){ if (0 == strcmp("$DIS", ptag)) { upDisplayData(pval); } return 0;} void process_package(char *pkg, int len){ char *p; char *ptag = NULL; char *pval = NULL; if (pkg[len-1] != '}') return; if (pkg[0] != '{') return; pkg[len-1] = 0; pkg[0] = 0; p = pkg+1; do { ptag = p; p = strchr(p, '='); if (p != NULL) { *p++ = 0; pval = p; p = strchr(p, ','); if (p != NULL) *p++ = 0; { process_command_call(ptag, pval); } } } while (p != NULL);}
这段代码主要是针对一个嵌入式系统的LCD显示器进行字符串的显示。具体流程如下:
1. 函数upDisplayData(char *str)接收一个字符指针参数,表示要显示的字符串内容。
2. 使用strlen()函数获取字符串长度,并用for循环遍历字符串,找到最后一个'\n'字符的位置,用变量local记录下来。
3. 根据local变量的值,判断是否需要分行显示。如果需要,则把第一行的内容拷贝到showString数组中,并用LCD_ShowString函数在屏幕上显示出来。如果字符串长度超过30个字符,则在第二行显示"data too large"。
4. 如果不需要分行显示,则直接把字符串内容拷贝到showString数组中,并用LCD_ShowString函数在屏幕上显示出来。如果字符串长度超过30个字符,则在屏幕上显示"data too large"。
5. 函数process_command_call(char *ptag, char *pval)接收两个字符指针参数,表示要处理的命令和参数。在这段代码中,只有一个命令"$DIS",表示要显示字符串。调用upDisplayData函数进行字符串显示。
6. 函数process_package(char *pkg, int len)接收一个字符指针参数和一个整型参数,表示一个完整的命令包和命令包的长度。函数首先检查命令包的格式是否正确,然后使用strchr函数解析出命令和参数,并调用process_command_call函数处理命令和参数。
总体来说,这段代码的功能是实现LCD显示器的字符串显示,通过解析命令包并调用相应的函数实现字符串的显示。
阅读全文