user-0 提问: 关于C语言字符串的问题

回复:
user: user-1
content: 仅供参考：void HexDump(char *buf,int len,int addr) {     int i,j,k;     char binstr[80];      for (i=0;i<len;i++) {         if (0==(i%16)) {             sprintf(binstr,"%08x -",i+addr);             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         } else if (15==(i%16)) {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);             sprintf(binstr,"%s  ",binstr);             for (j=i-15;j<=i;j++) {                 sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');             }             printf("%s\n",binstr);         } else {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         }     }     if (0!=(i%16)) {         k=16-(i%16);         for (j=0;j<k;j++) {             sprintf(binstr,"%s   ",binstr);         }         sprintf(binstr,"%s  ",binstr);         k=16-k;         for (j=i-k;j<i;j++) {             sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');         }         printf("%s\n",binstr);     } }

user: user-0
content: 引用 5 楼 lunat 的回复:     printf("sendBuf size:%d\n", 4 + strlen(&sendBuf[4]));     printf("sendBuf:%s \n", &sendBuf[4]);  或者，打印unsigned char： int i;  for (i = 0; i < 4 + msglen; ++i) {     printf("%02hhX ", sendBuf[i]); }  建议：把数据包封装一下，类似： typedef struct message_s {     int length;     char str[2000]; } message_t;  void message_dump(const message_t * msg) {     printf("length=%d, str=\"%s\"\n", msg->length, msg->str); }  void message_fill(message_t * msg, const char * str) {     strncpy(msg->str, str, sizeof(msg->str) - 1);     msg->str[sizeof(msg->str) - 1] = '\0';     msg->length = strlen(msg->str); }    谢谢，明天试试

user: user-2
content: printf("sendBuf size:%d\n", 4 + strlen(&sendBuf[4]));     printf("sendBuf:%s \n", &sendBuf[4]);  或者，打印unsigned char： int i;  for (i = 0; i < 4 + msglen; ++i) {     printf("%02hhX ", sendBuf[i]); }  建议：把数据包封装一下，类似： typedef struct message_s {     int length;     char str[2000]; } message_t;  void message_dump(const message_t * msg) {     printf("length=%d, str=\"%s\"\n", msg->length, msg->str); }  void message_fill(message_t * msg, const char * str) {     strncpy(msg->str, str, sizeof(msg->str) - 1);     msg->str[sizeof(msg->str) - 1] = '\0';     msg->length = strlen(msg->str); }

user: user-0
content: 引用 1 楼 lunat 的回复:little_endian(msglen, &sendBuf[0]); 第二个参数类型是unsigned char *，这个函数是把一个整数（msglen）放在sendBuf缓冲区中。  sendBuf不表示一个以\0结尾的C风格字符串！ 对sendBuf执行strlen(sendBuf)是错误的。strlen只能对以\0结尾的C风格字符串操作。 后面printf %s想打印出sendBuf，也是错误的。  主要是我需要发送sendbuf，send（）需要知道长度，strlen不行的话，是不是需要用sizeof（）

user: user-0
content: 引用 1 楼 lunat 的回复:little_endian(msglen, &sendBuf[0]); 第二个参数类型是unsigned char *，这个函数是把一个整数（msglen）放在sendBuf缓冲区中。  sendBuf不表示一个以\0结尾的C风格字符串！ 对sendBuf执行strlen(sendBuf)是错误的。strlen只能对以\0结尾的C风格字符串操作。 后面printf %s想打印出sendBuf，也是错误的。  谢谢。 之前尝试过sendbuf是unsigned char 然后执行  little_endian(msglen, &sendBuf[0]);  memcpy(&sendBuf[4], msg, msglen);     可是服务端说数据有问题，所以想打印出来看看到底是怎么回事，改成char为了打印方便。。。看来不对。  那这两句拼串的过程有什么问题么，如果是unsigned char ？ 如果想看unsigned char 数据，不用printf的话，怎么输出呢。 谢谢。

user: user-3
content: 楼上正解.  little_endian(msglen, &sendBuf[0]); //改为:  little_endian(1684234849, &sendBuf[0]); 试试.

user: user-2
content: little_endian(msglen, &sendBuf[0]); 第二个参数类型是unsigned char *，这个函数是把一个整数（msglen）放在sendBuf缓冲区中。  sendBuf不表示一个以\0结尾的C风格字符串！ 对sendBuf执行strlen(sendBuf)是错误的。strlen只能对以\0结尾的C风格字符串操作。 后面printf %s想打印出sendBuf，也是错误的。