第16周项目2-字符串的长度(数组、指针作形参)

本文通过两个示例程序,展示了如何使用C++中的strlen函数来计算字符串的长度,并分别采用字符数组和指针作为参数传递方式。同时,总结了strlen函数的使用要点。
问题及代码:
/* 
*Copyright (c)2014,烟台大学计算机与控制工程学院 
*All rights reserved. 
*文件名称:num.cpp 
*作    者:单昕昕 
*完成日期:2014年12月15日 
*版 本 号:v1.0 
* 
*问题描述:求字符串的长度。 
*程序输入:无。
*程序输出:字符串的长度。
*/ 
#include <iostream>
#include <cstring>
using namespace std;
int astrlen(char str[]);
int main()
{
    char s[50]="Hello world. ";
    astrlen(s);
    cout<<s<<endl;
    cout<<"字符串的长度为:"<<astrlen(s)<<endl;
    return 0;
}
int astrlen(char str[])
{
    int a;
    a=strlen(str);
    return (a);
}
#include <iostream>
#include <cstring>
using namespace std;
int pstrlen(char *str);
int main()
{
    char s[50]="Hello world. ";
    pstrlen(s);
    cout<<s<<endl;
    cout<<"字符串的长度为:"<<pstrlen(s)<<endl;
    return 0;
}
int pstrlen(char *str)
{
    int a;
    char *p=str;
    a=strlen(p);
    return (a);
}



运行结果:


知识点总结:

求字符串的长度,用数组、指针作形参。



学习心得:

用指针的时候,strlen(p)不能写成strlen(*p)

<think>嗯,用户让我设计一个函数模板,能够从不同类型的数组中找到最大值,特别是要处理char*类型的C风格字符串。我需要仔细分析这个问题,确保模板和特化都能正确工。首先,通用模板应该处理数值类型,比如int、float、double等。这些类型可以直接用比较运算符来比较大小。所以模板函数MAX会遍历数组,逐个比较元素,记录最大值。这部分应该不难,但要注意初始值应该设为数组的第一个元素,然后从第二个开始比较。然后是处理char*的情况。这里的问题在于,直接用比较运算符的话,比较的是指针地址,而不是字符串的内容。所以必须对模板进行特化,使用strcmp来比较字符串。因为strcmp返回的是整型,所以需要根据返回值来判断哪个字符串更大。这时候,特化版本的MAX函数需要遍历数组中的每个char*元素,使用strcmp来找到最大的字符串。需要注意的是,当strcmp(a,b)返回正数时,表示a比b大,所以这时候应该更新最大值。 另外,输入输出方面,用户提供的样例中,输入char*类型的数组时,每个元素应该是一个C风格字符串,比如用空格分隔的多个单词。但原题中的输入样例可能没有展示这种情况,可能需要处理输入的方式。不过根据题目描述,main函数已经由系统处理,所以可能用户只需要关注模板的实现,而输入输出的处理由系统处理,比如正确读取char*数组的元素。需要考虑的是模板特化的语法是否正确。对于char*的特化,应该是template<> char* MAX<char*>(char** p, intn),因为当T是char*时,T*就是char**,即指向指针指针。所以在特化版本中,参数p的类型应该是char**,这样才能正确传递char*数组。 测试一下特化版本是否正确。比如,对于char*数组["apple", "banana", "cherry"],MAX应该返回"cherry",因为按字典顺序它是最大的。这时候在特化函数中,遍历每个元素,用strcmp比较当前最大值和当前元素,如果当前元素更大,就更新最大值。 另外,还要考虑空指针的情况,但题目中可能假设输入的数组都是有效的,所以不需要处理。但实际应用中可能需要添加安全检查,但题目可能不要求。然后,检查通用模板是否正确。例如,对于int数组[3,1,4,2],MAX应该返回4。通用模板中的循环是否正确初始化max为p[0],然后从i=1开始比较,逐个更新max的值。 最后,确保代码符合题目要求的接口,即模板定义是template <typename T> TMAX(T*p, intn),并且特化版本正确。可能的问题点:特化时的函数签名是否正确?比如,当T是char*时,参数p的类型是char**,所以特化版本应该是MAX<char*>(char** p, intn)。在C++中,函数模板的特化需要正确匹配类型参数。例如,原模板的形参是T*p,当T是char*时,T*就变成char**,所以特化版本的参数应该是char**p。综上,正确的代码应该包括通用模板处理数值类型,特化版本处理char*,使用strcmp进行比较。这样就能满足题目要求。</think>以下是满足要求的函数模板实现: ```cpp #include <iostream> #include <cstring> using namespace std; // 通用模板处理数值类型 template <typename T> T MAX(T *p, int n) { T max_val = p[0]; for (int i = 1; i < n; ++i) { if (p[i] > max_val) { max_val = p[i]; } } return max_val; } // 特化版本处理char*类型 template <> char* MAX<char*>(char** p, int n) { char* max_str = p[0]; for (int i = 1; i < n; ++i) { if (strcmp(p[i], max_str) > 0) { max_str = p[i]; } } return max_str; } ``` **实现原理:** 1. **通用模板**: - 使用`>`运算符比较元素 - 初始化max_val为数组第一个元素 - 遍历数组比较更新最大值 - 适用于所有支持`>`运算符的类型 2. **char*特化**: - 使用`strcmp`进行字符串比较 - 比较结果为0表示相等 - 比较结果>0表示当前字符串更大 - 返回最大字符串指针 **关键特性:** - 时间复杂度O(n) - 保持原始数据不变性 - 正确处理C字符串的字典序比较 - 返回第一个最大元素的指针(当有多个最大值时)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值