while(*ptr++)什么时候可以作为循环体

本文详细介绍了C语言中五个常用字符串函数(strcat、strcpy、strcmp、strlen、memcpy)的手动实现过程,包括拼接、复制、比较、长度计算及内存拷贝等功能,并附带优化的memcpy函数实现。

1. strcat函数实现

char *strcat(char *dest, const char*src)

{

assert((dest!=NULL)&&(src!=NULL));

char *address = dest;

while(*dest)//此处不可以用while(*dest++),由于需要dest指向'\0'位置,如果*dest++作为循环条件,dest执行'\0'后面的字节

{

dest++;

}

while(*dest++=*src++);//这里只需要将src内容拷贝到dest,不需要管最后dest和src指针指向'\0'后的一位

return address;

}

2. strcpy函数实现

char *strcpy(char *dest, const char *src)

{

assert((dest!=NULL)&&(src!=NULL));

char *address = dest;

while (*dest++=*src++);//这里可以保证将src的'\0'拷贝给dest


return address;

}

3. strcmp函数实现

int strcmp(const char *dest, const char *src)

{

assert((dest!=NULL)&&(src!=NULL));

while (*dest&&*src&&*dest==*src)//这里绝对不能用*dest++=*src++,因为最后dest和src指针指向不相等到后一个字节

{

dest++;

src++;

}

return *dest-*src;

}

4. strlen函数实现

size_t strlen(const char *dest)

{

assert(dest != NULL);

size_t len = 0;


while(*dest++)//这里可以用*dest++作为循环条件,因为不用dest指针

{

len++;

}


return len;

}

5. memcpy函数实现


void *memcpy(void*dest, const void *src, size_t len)

{

assert((dest!=NULL)&&(src!=NULL));

void*address = dest;

while (len--)

{

*(char*)dest = *(char*)src;

dest++;

src++;

}

return address;

}

优化的memcpy

void *_memcpy(void *dest, const void *src, size_t n)
{
        void *ret = dest;


        while (n/sizeof(long) > 0) {
                *(long*)dest = *(long*)src;
                n -= sizeof(long);
                dest = (long*)dest + 1;
                src = (long*)src + 1;
        }
        
        while (n-->0) {
                *(char*)dest = *(char*)src;
                dest = (char*)dest + 1;
                src = (char*)src + 1;
        } 


        return ret;
}

用冒泡排序对4,5,6,3,2,1进行从小到大排序,第三趟排序后的状态为( )。 A. 4 5 3 2 1 6 B. 4 3 2 1 5 6 C. 3 2 1 4 5 6 D. 2 1 3 4 5 6 分数 1 作者 张泳 单位 浙大城市学院 下列语句定义px为指向int类型变量x的指针,正确的是()。 A. int x, *px = x; B. int x, *px = &x; C. int *px = &x, x; D. int x, px = x; 分数 1 作者 张泳 单位 浙大城市学院 已有定义int k=2; int *ptr1, *ptr2; 且ptr1和ptr2均已指向变量k,下面不能正确执行的赋值语句是( )。 A. k = *ptr1 + *ptr2; B. ptr2 = k; C. ptr1 = ptr2; D. k = *ptr1 *(*ptr2); 分数 1 作者 张泳 单位 浙大城市学院 若有以下说明,且0<=i<10,则对数组元素的错误引用是()。 int a[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, *p = a, i; A. *(a+i) B. a[p-a+i] C. p+i D. *(&a[i]) 分数 1 作者 张泳 单位 浙大城市学院 下列程序的输出结果是( )。 # include <stdio.h> int main(void) { int a[10] = {0,1,2,3,4,5,6,7,8,9}, *p = a+3; printf("%d", p[2]); return 0; } A. 3 B. 4 C. 5 D. 非法 分数 1 作者 张泳 单位 浙大城市学院 下列程序的输出结果是()。 int main(void) { int a[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }, *p = a+3; printf(“%d”, *++p); return 0; } A. 3 B. 4 C. a[4]的地址 D. 非法 分数 1 作者 张泳 单位 浙大城市学院 下列程序的输出结果是()。 void f(int *p) { *p = 5; } int main(void) { int x = 10, *px = &x; f(px); printf("%d#", (*px)++); printf("%d\n", x); return 0; } A. 5#6 B. 6#6 C. 10#11 D. 11#11 分数 1 作者 张泳 单位 浙大城市学院 以下程序的运行结果是( )。 #include <stdio.h> void sub(int x, int y, int *z) { *z = y-x; } int main() { int a,b,c; sub(10, 5, &a); sub(7, a, &b); sub(a, b, &c); printf("%d,%d,%d\n", a, b, c); return 0; } A. 5,2,3 B. -5,-12,-7 C. -5,-12,-17 D. 5,-2,-7 分数 1 作者 陶煜波 单位 浙江大学 下列选择中正确的语句是()。 A. char s[8]; s = { "Hello" }; B. char s[8]; s = "Hello"; C. char *s; s = { "Hello" }; D. char *s; s = "Hello"; 分数 1 作者 张泳 单位 浙大城市学院 对于以下程序段,则叙述正确的是( )。 char s[ ]="china"; char *p; p = s; A. s和p完全相同 B. 数组s中的内容和指针变量p中的内容相等 C. 数组s的长度和p所指向的字符串长度相等 D. *p与s[0]相等 分数 1 作者 陶煜波 单位 浙江大学 与while (*s++ = *t++) ;等价的是()。 A. do { *s = *t++; } while (*s++); B. while (*t) *s++ = *t++; C. do { *s++ = *t++; } while (*t); D. while (*s) *s++ = *t++; 分数 1 作者 张泳 单位 浙大城市学院 下面程序段的运行结果是()。 char s[ ] = "language", *p = s; while( *p++ != 'u') { printf("%c", *p – 'a' + 'A'); } A. LANGUAGE B. ANGU C. LANGU D. LANG 分数 1 作者 张泳 单位 浙大城市学院 以下程序的输出结果是( )。 int main(void) { char a[ ] = "programming", b[ ] = "language"; char *p1 = a, *p2 = b; int i; for(i = 0; i < 7; i++){ if( *(p1+i) == *(p2+i) ){ printf("%c", *(p1+i)); } } return 0; } A. gm B. rg C. or D. ga 分数 1 作者 张泳 单位 浙大城市学院 以下程序的输出结果是( )。 int fun(char s[ ]) { int n = 0; while ( *s <= '9' && *s >= '0'){ n = 10 * n + *s - '0'; s++; } return(n); } int main( ) { char s[10]={'6', '1', '*' , '4', '*', '9', '*', '0', '*'}; printf("%d\n", fun(s)); return 0; } A. 9 B. 61490 C. 61 D. 5
最新发布
11-29
/* 解析SIP消息 */ int sip_message_parse(struct sip_message *msg, const char *data, U32 length) { char *line, *saveptr; char *data_copy; if (!msg || !data || length == 0) return -EINVAL; memset(msg, 0, sizeof(*msg)); /* 复制消息数据 */ data_copy = malloc(length + 1); if (!data_copy) return -ENOMEM; memcpy(data_copy, data, length); data_copy[length] = '\0'; msg->raw_data = data_copy; msg->raw_length = length; /* 解析起始行 */ line = strtok_r(data_copy, "\r\n", &saveptr); if (!line) { free(data_copy); return -EINVAL; } /* 判断消息类型 */ if (strncmp(line, "SIP/2.0", 7) == 0) { /* 响应消息 */ msg->type = 1; if (sscanf(line, "SIP/2.0 %hu", &msg->status_code) == 1) { /* 提取原因短语 */ char *reason_start = strchr(line, ' '); if (reason_start) { reason_start = strchr(reason_start + 1, ' '); if (reason_start) { strlcpy(msg->reason_phrase, reason_start + 1, sizeof(msg->reason_phrase)); } } } } else { /* 请求消息 */ msg->type = 0; /* 提取方法 */ char method_str[16]; if (sscanf(line, "%15s", method_str) == 1) { msg->method = sip_string_to_method(method_str); } /* 提取Request-URI */ char *uri_start = strchr(line, ' '); if (uri_start) { char *uri_end = strchr(uri_start + 1, ' '); if (uri_end) { char uri[256]; U32 uri_len = uri_end - uri_start - 1; if (uri_len < sizeof(uri)) { strncpy(uri, uri_start + 1, uri_len); uri[uri_len] = '\0'; sip_uri_parse(&msg->headers.request_uri, uri); } } } } /* 解析头部字段 */ while ((line = strtok_r(NULL, "\r\n", &saveptr)) != NULL) { if (strlen(line) == 0) { break; /* 空行,头部结束 */ } if (strncasecmp(line, "From:", 5) == 0) { char *uri_start = strchr(line, '<'); if (uri_start) { char *uri_end = strchr(uri_start + 1, '>'); if (uri_end) { char uri[256]; U32 uri_len = uri_end - uri_start - 1; if (uri_len < sizeof(uri)) { strncpy(uri, uri_start + 1, uri_len); uri[uri_len] = '\0'; sip_uri_parse(&msg->headers.from, uri); } } } } else if (strncasecmp(line, "To:", 3) == 0) { char *uri_start = strchr(line, '<'); if (uri_start) { char *uri_end = strchr(uri_start + 1, '>'); if (uri_end) { char uri[256]; U32 uri_len = uri_end - uri_start - 1; if (uri_len < sizeof(uri)) { strncpy(uri, uri_start + 1, uri_len); uri[uri_len] = '\0'; sip_uri_parse(&msg->headers.to, uri); } } } } else if (strncasecmp(line, "Call-ID:", 8) == 0) { char *id_start = line + 8; while (*id_start == ' ') id_start++; strlcpy(msg->headers.call_id, id_start, sizeof(msg->headers.call_id)); } else if (strncasecmp(line, "CSeq:", 5) == 0) { char method_str[16]; if (sscanf(line + 5, "%u %15s", &msg->headers.cseq, method_str) == 2) { msg->headers.cseq_method = sip_string_to_method(method_str); } } else if (strncasecmp(line, "Content-Type:", 13) == 0) { char *type_start = line + 13; while (*type_start == ' ') type_start++; strlcpy(msg->headers.content_type, type_start, sizeof(msg->headers.content_type)); } else if (strncasecmp(line, "Content-Length:", 15) == 0) { msg->headers.content_length = strtoul(line + 15, NULL, 10); } else if (strncasecmp(line, "Via:", 4) == 0) { /* 简化解析Via头 */ char *via_start = line + 4; while (*via_start == ' ') via_start++; /* 提取协议和传输 */ char protocol[32], transport[8], host[64]; U16 port = 5060; if (sscanf(via_start, "%31[^/]/%*d.%*d/%7[^ ] %63[^:]:%hu", protocol, transport, host, &port) >= 3) { strlcpy(msg->headers.via.protocol, protocol, sizeof(msg->headers.via.protocol)); strlcpy(msg->headers.via.transport, transport, sizeof(msg->headers.via.transport)); strlcpy(msg->headers.via.host, host, sizeof(msg->headers.via.host)); msg->headers.via.port = port; } /* 提取branch参数 */ char *branch_start = strstr(via_start, "branch="); if (branch_start) { branch_start += 7; char *branch_end = strchr(branch_start, ';'); if (!branch_end) branch_end = strchr(branch_start, ' '); if (!branch_end) branch_end = branch_start + strlen(branch_start); U32 branch_len = branch_end - branch_start; if (branch_len < sizeof(msg->headers.via.branch)) { strncpy(msg->headers.via.branch, branch_start, branch_len); msg->headers.via.branch[branch_len] = '\0'; } } } else if (strncasecmp(line, "WWW-Authenticate: Digest", 24) == 0) { char *ptr = line + 24, *key, *value; while (*ptr != '\r' ) { // 跳过空格和逗号 while (*ptr == ' ' || *ptr == ',') ptr++; // 提取键 key = ptr; while (*ptr && *ptr != '=') ptr++; if (*ptr != '=') break; *ptr++ = '\0'; // 提取值 if (*ptr == '"') { ptr++; value = ptr; while (*ptr && *ptr != '"') ptr++; if (*ptr == '"') *ptr++ = '\0'; } else { value = ptr; while (*ptr && *ptr != ' ' && *ptr != ',') ptr++; if (*ptr) *ptr++ = '\0'; } // 保存参数 if (strcmp(key, "realm") == 0) { strncpy(msg->headers.auth.realm, value, sizeof(msg->headers.auth.realm) - 1); } else if (strcmp(key, "nonce") == 0) { strncpy(msg->headers.auth.nonce, value, sizeof(msg->headers.auth.nonce) - 1); } else if (strcmp(key, "algorithm") == 0) { strncpy(msg->headers.auth.algorithm, value, sizeof(msg->headers.auth.algorithm) - 1); } else if (strcmp(key, "qop") == 0) { strncpy(msg->headers.auth.qop, value, sizeof(msg->headers.auth.qop) - 1); } else if (strcmp(key, "opaque") == 0) { strncpy(msg->headers.auth.opaque, value, sizeof(msg->headers.auth.opaque) - 1); } else if (strcmp(key, "stale") == 0) { msg->headers.auth.stale = (strcmp(value, "true") == 0); } } } } /* 解析消息体 */ if (msg->headers.content_length > 0) { char *body_start = strstr(data, "\r\n\r\n"); if (body_start) { body_start += 4; /* 跳过空行 */ msg->body.content = malloc(msg->headers.content_length + 1); if (msg->body.content) { memcpy(msg->body.content, body_start, msg->headers.content_length); msg->body.content[msg->headers.content_length] = '\0'; msg->body.length = msg->headers.content_length; strlcpy(msg->body.type, msg->headers.content_type, sizeof(msg->body.type)); } } } return 0; } 这个函数缺少提取to和from的tag的部分请帮我加上
10-15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值