int compare(char* dest,char* src)

09年华赛在成都的两道试题。

 

C语言实现:

[1]

给出一个函数,原型为 int compare(char* dest,char* src)
要求比较两个字符串(由dest与src字符指针标识)
1,如果两字符串所含字母完全相同,则逆序输出字符串 并返回0;
2,如果两字符串所含字母相同(不区分大小写;A与a也算字母相同) ,则返回1 ;
3,否则返回3 。

[2]
文件data.in中保存有m (m < 2000) 个数据行,每行最多包含25个由空格分隔的正整数。给出整数k(k <26),计算文件中第k列所有数据的最大值、最小值和平均值。最大值和最小值以整数格式输出,平均值保持两位小数。若某行的列数小于k,则认为该行第k列的值为0。 

 

问题来源:http://topic.youkuaiyun.com/u/20090220/17/afc59963-c997-4215-8a68-428acbc8c752.html

 

第一题我的解法如下:

 

上述逆序输出字符串改用栈的方法如下:

 

与我想法基本一样的一位朋友(riceli)的代码,看起来更规范点儿:

 

若使用库函数的方法:

 

等价于:

 

上面的库函数由自己实现:

 

使用标准库string类型比较字符串:

 


 第二题待续...

 

 

/* Copyright(c) 2009-2025 Shenzhen TP-LINK Technologies Co. Ltd. * Author: ChenZhuo chenzhuo1@tp-link.com.hk * Date: 2025-07-30 15:48:14 * LastEditors: ChenZhuo chenzhuo1@tp-link.com.hk * LastEditTime: 2025-07-31 18:11:06 * FilePath: /project/practice1/bulk_mem_cpy.c * Description: 提高memcpy效率,编写新的内存函数 */ #include <stdio.h> #include <string.h> #include <time.h> /**************************************************************************************************/ /* DEFINES */ /**************************************************************************************************/ /* 定义字符数组最大长度 */ #define MAXLEN 5000000 /**************************************************************************************************/ /* LOCAL_PROTOTYPES */ /**************************************************************************************************/ /* 自编块拷贝函数 */ static int bulk_mem_cpy(unsigned char *to, unsigned char *from, int len); /**************************************************************************************************/ /* LOCAL_FUNCTIONS */ /**************************************************************************************************/ char random_char() { int random_value = rand() % 62; // 62是字母和数字的总数 if (random_value < 26) { return 'A' + random_value; // 生成大写字母 } else if (random_value < 52) { return 'a' + (random_value - 26); // 生成小写字母 } else { return '0' + (random_value - 52); // 生成数字 } } int min(int a, int b) { return (a < b) ? a : b; } /* * fn buk_mem_cpy(unsigned char *to, unsigned char *from, int len) * brief 使用8字节拷贝代替memcpy单字节拷贝提升效率,并解决内存重叠问题。 * param[in] to 目标区域首地址 * param[in] from 源区域地址 * param[in] len 拷贝字节长度 */ static int bulk_mem_cpy(unsigned char *to, unsigned char *from, int len) { /* 参数输入错误进行提醒 */ if (to == NULL || from == NULL || len <= 0) { printf("参数无效\n"); return -1; } /* 记录拷贝终止点 */ unsigned char *to_end = to + len - 1; unsigned char *from_end = from + len - 1; /* 使用8字节进行拷贝,对地址进行转换 */ unsigned long long *to_ll = (unsigned long long *)to; unsigned long long *to_end_ll = (unsigned long long *)to_end; unsigned long long *from_ll = (unsigned long long *)from; unsigned long long *from_end_ll = (unsigned long long *)from_end; /* 计算8字节拷贝次数和剩余单字节数 */ int count = len / sizeof(unsigned long long); int remain = len % sizeof(unsigned long long); /* 目标区域与源区域存在内存重叠,且目标首地址在源拷贝区域内,从后往前进行拷贝 */ if (to > from && to < from + len) { /* 8字节拷贝 */ while (count--) { *to_end_ll-- = *from_end_ll--; } /* 转为单字节拷贝 */ unsigned char *to_pos_c = (unsigned char *)to_end_ll; unsigned char *from_pos_c = (unsigned char *)from_end_ll; while (remain--) { *to_pos_c-- = *from_pos_c--; } } /* 目标区域与源区域存在内存重叠,而源区域首地址在目标拷贝区域内,从前往后进行正常拷贝 */ else { /* 8字节拷贝 */ while (count--) { *to_ll++ = *from_ll++; } /* 转为单字节拷贝 */ unsigned char *to_pos = (unsigned char *)to_ll; unsigned char *from_pos = (unsigned char *)from_ll; while (remain--) { *to_pos++ = *from_pos++; } } return 0; } int main() { int begintime, endtime; int test_begintime, test_endtime; char test_str_memcpy[MAXLEN]; char test_str_bulcpy[MAXLEN]; unsigned int src; unsigned int dst; unsigned int len; unsigned int test_time = 10; while (test_time--) { /* 随机生成字符串 */ for (int i = 0; i < MAXLEN; i++) { char c = random_char(); test_str_memcpy[i] = c; test_str_bulcpy[i] = c; } /* 随机选择源位置和目的位置 */ src = rand() % MAXLEN; dst = rand() % MAXLEN; /* 随机选择拷贝的长度 */ len = rand() % min(MAXLEN - src, MAXLEN - dst); /* 拷贝测试,如有必要可记录时间 */ test_begintime = clock(); bulk_mem_cpy(test_str_bulcpy + dst, test_str_bulcpy + src, len); test_endtime = clock(); printf("\n bulk_mem_cpy running Time is : %dms\n", test_endtime - test_begintime); begintime = clock(); memcpy(test_str_memcpy + dst, test_str_memcpy + src, len); endtime = clock(); printf("\n memecpy running Time is : %dms\n", endtime - begintime); /* 检验结果 */ if (memcmp(test_str_memcpy, test_str_bulcpy, 100) == 0) { /* success */ printf("自编函数正确"); } else { /* fail */ printf("自编函数失败"); } } return 0; }
最新发布
08-07
#include <stddef.h> #include <stdint.h> #include <stdio.h> #include <string.h> #include <assert.h> void bulk_mem_copy(void *dst, const void *src, size_t size) { if(!dst || !src || 0 == size) { return; } uint8_t *d = dst; const uint8_t *s = src; if (d > s && d < s + size) /* 如果有重叠区域则从后往前拷贝 */ { d += size; s += size; while (size--) { *--d = *--s; } } else /* 正向拷贝 */ { size_t chunk = size / sizeof(uint64_t);/* 计算64位块数量 */ uint64_t *d64 = (uint64_t*)d;/* 将目标指针转换为64位指针:允许按机器字长操作 */ const uint64_t *s64 = (const uint64_t*)s; /* 将源指针转换为64位指针:确保对齐访问 */ while (chunk--) /* 循环拷贝完整64位块 */ { *d64++ = *s64++; } d = (uint8_t*)d64; s = (const uint8_t*)s64; size %= sizeof(uint64_t);/* 计算剩余字节 */ while (size--) { *d++ = *s++; } } } int mem_compare(const void *a, const void *b, size_t size) { const uint8_t *pa = a; const uint8_t *pb = b; for (size_t i = 0; i < size; i++) { if (pa[i] != pb[i]) { printf("差异位置: %zu, 预期: 0x%02X, 实际: 0x%02X\n", i, pb[i], pa[i]); return -1; } } return 0; } void test_overlap_copy() /* 重叠区域 */ { printf("\n===== 测试重叠区域拷贝 =====\n"); char buffer[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; const char *src = buffer; char *dst = buffer + 5; printf("原始: %s\n", buffer); bulk_mem_copy(dst, src, 15); const char *expected = "ABCDEABCDEFGHIJKLPQRSTUVWXYZ"; printf("结果: %s\n", buffer); printf("预期: %s\n", expected); assert(mem_compare(buffer, expected, sizeof(buffer)) == 0); printf("测试通过: 重叠区域拷贝\n"); } void test_large_block_copy() /* 大内存块性能 */ { printf("\n===== 测试大内存块拷贝 =====\n"); const size_t SIZE = 1 << 20; // 1MB uint8_t *src = malloc(SIZE); uint8_t *dst = malloc(SIZE); // 填充随机数据 for (size_t i = 0; i < SIZE; i++) { src[i] = rand() & 0xFF; } bulk_mem_copy(dst, src, SIZE); assert(mem_compare(dst, src, SIZE) == 0); printf("测试通过: 1MB内存块拷贝\n"); free(src); free(dst); } int main() { test_overlap_copy(); test_large_block_copy(); printf("\n所有测试用例通过!\n"); return 0; }十二行和83行报错
08-02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值