find_len.c

  #include <stdio.h>

int string_length(char *);

void main(void)
 {
   char *title= "Jamsa/'s C/C++ Programmer/'s Bible";
   char *section = "Tools";

   printf("Length of %s is %d/n", title, string_length(title));
   printf("Length of %s is %d/n", section, string_length(section));
 }

 

#include<iostream> #include<cstdio> class hstring { unsigned int uselen; unsigned int usesize; char* cstr; public: hstring() ; const char* c_str() const;//使用接口访问 void set_string(const char* input); void append(const hstring& other); int find_string(const char* find); int sub_string(const char* sub); int mod_string(int pos,const char* sou,const char* rep); int con_string( long long str); }; hstring::hstring() :uselen(0), usesize(128), cstr(new char[usesize]) {//默认构造函数进行初始化 cstr[0] = '\0'; }; const char* hstring::c_str() const {//接口调用函数 return cstr; } void hstring::set_string(const char* input) { int i = 0; while (input[uselen] != '\0')++uselen;//读取字符串长度 //printf("%d\n", uselen); while (uselen > usesize - 1) { usesize *= 2; } char* new_cstr = new char[usesize]; while (input[i] != '\0' && i < usesize - 1) { new_cstr[i] = input[i]; ++i; } new_cstr[i] = '\0'; if (cstr != nullptr) { delete[]cstr; } cstr = new_cstr; } void hstring::append(const hstring& other) { /*int new_len = this->uselen + other.uselen; int new_size = usesize; if (new_len+1 > usesize ) { usesize*=2; while (usesize <= new_len + 1) { usesize *= 2; } } char* new_str = new char[usesize]; int i = 0; for (i = 0; i<uselen; ++i) { new_str[i] = cstr[i]; } for (i = 0; i < other.uselen; ++i) { new_str[uselen + i] = other.cstr[i]; } new_str[new_len] = '\0'; delete[]cstr; cstr = new_str; uselen = new_len; usesize = new_size;*/ int new_len = this->uselen + other.uselen; int new_size = usesize; // 如果当前容量不够容纳新内容,扩容 if (new_len + 1 > usesize) { new_size *= 2; while (new_size <= new_len + 1) { new_size *= 2; } } char* new_str = new char[new_size]; // 分配新空间 // 复制原字符串内容(不包括结尾的 '\0') for (int i = 0; i < uselen; ++i) { new_str[i] = cstr[i]; } // 拼接新字符串内容(不包括结尾的 '\0') for (int i = 0; i < other.uselen; ++i) { new_str[uselen + i] = other.cstr[i]; } // 添加结尾 '\0' new_str[new_len] = '\0'; // 删除旧内存 delete[] cstr; // 更新成员变量 cstr = new_str; uselen = new_len; usesize = new_size; printf("%s", cstr); } int hstring::find_string(const char* find) { if (cstr == nullptr) { printf("源字符串为空指针\n"); return -1; } if (find == nullptr) { printf("输入字符串为空指针\n"); return -1; } int main_len = uselen; int find_len = 0; while (find[find_len] != '\0')++find_len; if (find_len == 0) { printf("为空字符串,默认匹配位置为0\n"); return 0; } if (main_len < find_len) { printf("主字符串小于子字符串大小\n"); return -1; } for (int i = 0; i < main_len - find_len; ++i) { int j = 0; while(j < find_len && cstr[i + j] == find[j]){ ++j; } if (j == find_len) printf("找到字符串,位置:%d",i); return i; } printf("未找到字符串\n"); return -1; } int hstring::sub_string(const char* sub) { if (sub == nullptr) { printf("子字符串为空指针\n"); return -1; } int sub_len = 0; while (sub[sub_len] != '\0') ++sub_len; if (sub_len == 0) { printf("字符串为空字符串\n"); return -1; } if (cstr[0] == '\0') { printf("主字符串为空字符串\n"); return -1; } int pos = -1; for (int i = 0; i <= uselen - sub_len; ++i) { int j = 0; while (j < sub_len && cstr[i + j] == sub[j]) { ++j; } if (j == sub_len) { pos = i; break; } } if (pos == -1) { printf("未找到字符串\n"); return -1; } // int i = pos; while (i + sub_len < uselen && cstr[i + sub_len] != '\0') { cstr[i] = cstr[i + sub_len]; // 前移子串长度后的字符 i++; } cstr[i] = '\0'; // 添加字符串结束符 uselen -= sub_len; return pos; } int hstring::mod_string(int pos, const char* sou ,const char* rep) { if (sou== nullptr) { printf("被替换字符串为空指针\n"); return -1;} int sou_len = 0; while (sou[sou_len] != '\0')++sou_len; if (sou_len == 0) { printf("被替换字符串为空字符串\n"); return -1;} if (rep == nullptr) { printf("替换字符串为空指针\n"); return -1; } int rep_len = 0; while (rep[rep_len] != '\0')++rep_len; if (rep_len == 0) { printf("替换字符串为空字符串\n"); return -1; } int find_pos = -1; for (int i = pos; i <= uselen - sou_len; ++i) { int j = 0; while (j < sou_len && cstr[i + j] == sou[j]) { ++j; } if (j == sou_len) { find_pos=i; break; } } if (find_pos == -1) { printf("未找到需要被替换的字符串"); return -1; } int new_len = uselen + (rep_len - sou_len); if (new_len > usesize) { while (usesize <= new_len) { usesize *= 2; } char* new_cstr = new char[usesize]; for (int i = 0; i < find_pos; ++i) { new_cstr[i] = cstr[i]; } for (int i = 0; i < rep_len; ++i) { new_cstr[find_pos + i] = rep[i]; } for (int i = 0; i < uselen - rep_len - find_pos; ++i) { new_cstr[find_pos + rep_len + i] = cstr[find_pos + sou_len + i]; } new_cstr[new_len] = '\0'; delete[]cstr; new_cstr = cstr; } else { if (rep_len > sou_len) { int dif_len = rep_len - sou_len; for (int i = uselen - 1; i >= find_pos + sou_len; --i) { cstr[i + dif_len] = cstr[i]; } } if (rep_len < sou_len) { int dif_len = sou_len - rep_len; for (int i = find_pos + sou_len; i < uselen; ++i) { cstr[i - dif_len] = cstr[i]; } } for(int i=0;i<rep_len;++i){ cstr[find_pos + i] = rep[i]; } uselen = new_len; cstr[uselen] = '\0'; } //printf("%s\n", cstr); return find_pos; } //第一先确定输入内容是否为0大于还是小于0; //当大于0时通过取余的方式来计算长度,将取余的内容加入到创建的字符串内存 //输出即可; //小于0时,首先让输入数字变成绝对值,再通过取余的方式来计算长度,将取余的内容加入到创建的字符串内存 int hstring::con_string( long long str) { char fstr[128] = { '\0' }; char* dstr; dstr = fstr; bool negative = (str < 0) ? true : false; int strlen = 0; uselen= 0; if (negative) { uselen++; cstr[0] = '-'; str = -str; } while (str > 0) { dstr[strlen++] = str % 10 + 48; str = str / 10; } while (strlen> 0) { cstr[uselen++] = dstr[--strlen]; } cstr[uselen] = '\0'; //printf("%s", cstr); return 0; } //第一种简单直观的方法: int main() { hstring s; s.set_string("123456789\n"); printf("测试输入和输出:%s\n", s.c_str());//使用接口访问//测试缓冲区 hstring s1; s1.set_string("abc"); s.append(s1); printf("字符串相加为:%s\n", s.c_str());//完成字符串相加+ // hstring x; // x.set_string("123456789"); // hstring s2; // s2.set_string("456"); // x.find_string(s2.c_str()); // printf("查找到的字符串为:%s\n\n\n", s2.c_str());//完成查找 // // hstring s3; // s3.set_string("123456789"); // hstring s4; // s4.set_string("1234"); // s3.sub_string(s4.c_str()); // printf("删减后的字符串为:%s\n", s3.c_str());//完成删减 // // hstring s5; // s5.set_string("123456789\n"); // s5.mod_string(3, "45", "fcf");//完成替换 // printf("替换后的字符串为:%s\n", s5.c_str()); // // hstring s6; // s6.con_string(-123456789000);//完成类型转换 // printf("类型转换字符串为:%s\n", s6.c_str()); } 请根据我的上下文来改正上面这个问题,注释不要管
08-16
function [pesq_mos, pesq_seg] = pesq(ref, deg, fs) % Check inputs if nargin < 3 fs = 16000; end if nargin < 2 error('Not enough input arguments'); end if length(ref) ~= length(deg) error('Input signals must be of equal length'); end % Load filter coefficients load('pesq_filter.mat'); % High-pass filter deg_hp = filter(b_hp, a_hp, deg); % Remove silence [r_beg, r_end] = find_voiced(ref, fs); [d_beg, d_end] = find_voiced(deg_hp, fs); r_sig = ref(r_beg:r_end); d_sig = deg_hp(d_beg:d_end); % Find maximum length sig_len = min(length(r_sig), length(d_sig)); % Filter signals r_sig = filter(b_lpf, a_lpf, r_sig(1:sig_len)); d_sig = filter(b_lpf, a_lpf, d_sig(1:sig_len)); % Resample signals r_sig = resample(r_sig, 8000, fs); d_sig = resample(d_sig, 8000, fs); % Calculate PESQ [pesq_mos, pesq_seg] = pesq_mex(r_sig, d_sig); end function [beg, endd] = find_voiced(sig, fs) % Set parameters win_len = 240; win_shift = 80; sil_thresh = 30; min_voiced = 0.1; % Calculate energy sig_pow = sig.^2; sig_pow_filt = filter(ones(1, win_len)/win_len, 1, sig_pow); % Normalize sig_pow_filt = sig_pow_filt/max(sig_pow_filt); % Find voiced segments beg = []; endd = []; num_voiced = 0; for n = 1:win_shift:length(sig)-win_len if sig_pow_filt(n+win_len/2) > min_voiced && ... mean(sig_pow_filt(n:n+win_len-1)) > sil_thresh if isempty(beg) beg = n; end else if ~isempty(beg) endd = [endd n-1]; num_voiced = num_voiced + 1; beg = []; end end end if ~isempty(beg) endd = [endd length(sig)]; num_voiced = num_voiced + 1; end % Remove segments that are too short min_len = fs*0.05; len_voiced = endd-beg+1; too_short = len_voiced < min_len; beg(too_short) = []; endd(too_short) = []; end这段代码中的pesq_mex.mex64文件怎么编译
05-11
该代码块定义了一个名为 `urlFilter_lru_cache_add_empty_node` 的函数,用于向LRU(Least Recently Used)缓存中添加一个空节点。以下是对代码块的详细分析: ### 代码功能概述 此函数的主要功能是将一个新的URL添加到LRU缓存中。如果缓存已满,会先删除尾部节点,然后分配新的节点,对节点进行初始化,将其添加到相应的链表中,最后更新缓存的节点数量,并将URL发送给用户。 ### 代码具体内容分析 ```c if(NULL == url) return false; ``` - 检查传入的 `url` 指针是否为 `NULL`。如果为 `NULL`,说明传入的URL无效,函数直接返回 `false`,表示添加节点失败。 ```c char *url_to_find = url; ``` - 将传入的 `url` 指针赋值给 `url_to_find`,方便后续使用。 ```c struct urlFilter_lru_node *urlFilter_node; ``` - 声明一个 `struct urlFilter_lru_node` 类型的指针 `urlFilter_node`,用于指向即将分配的新节点。 ```c if(lru_head.num_node_all >= lru_head.num_node_max) { urlFilter_lru_cache_del_tail_node(); } ``` - 检查当前LRU缓存中的节点总数 `lru_head.num_node_all` 是否超过了最大节点数 `lru_head.num_node_max`。如果超过了,调用 `urlFilter_lru_cache_del_tail_node` 函数删除尾部节点,以腾出空间。 ```c urlFilter_node = mempool_alloc_priv(lru_head.node_mempool, GFP_ATOMIC); if(NULL == urlFilter_node) { return false; } ``` - 尝试从内存池 `lru_head.node_mempool` 中分配一个新的 `struct urlFilter_lru_node` 类型的节点,使用 `GFP_ATOMIC` 标志表示以原子方式进行内存分配。如果分配失败,即 `urlFilter_node` 为 `NULL`,函数返回 `false`,表示添加节点失败。 ```c strncpy(urlFilter_node->domain, url_to_find, URL_LEN); strncpy(urlFilter_node->category, "NULL", NAME_LEN); urlFilter_node->category_id = -1; urlFilter_node->status = 0; bitmap_clear_bit(urlFilter_node->categories_bitmap, CATEGORIES_BITMAP_LEN); ``` - 对新分配的节点进行初始化: - 使用 `strncpy` 函数将 `url_to_find` 复制到节点的 `domain` 字段中,最多复制 `URL_LEN` 个字符。 - 将节点的 `category` 字段设置为 `"NULL"`,最多复制 `NAME_LEN` 个字符。 - 将节点的 `category_id` 字段设置为 `-1`,表示未分类。 - 将节点的 `status` 字段设置为 `0`。 - 调用 `bitmap_clear_bit` 函数清除节点的 `categories_bitmap` 位图,位图长度为 `CATEGORIES_BITMAP_LEN`。 ```c list_add(&urlFilter_node->hlist, &hentry->node_list); list_add(&urlFilter_node->list, &lru_head.lru_list->node_list); ``` - 将新节点添加到两个链表中: - 将节点的 `hlist` 字段添加到 `hentry` 的 `node_list` 链表中。 - 将节点的 `list` 字段添加到 `lru_head.lru_list` 的 `node_list` 链表中。 ```c lru_head.num_node_all++; lru_head.lru_list->curr++; ``` - 更新LRU缓存的节点总数 `lru_head.num_node_all` 和 `lru_head.lru_list` 的当前节点数 `curr`。 ```c send_url_to_user(url_to_find); ``` - 调用 `send_url_to_user` 函数,将 `url_to_find` 发送给用户。 ```c return true; ``` - 最后,函数返回 `true`,表示添加节点成功。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值