C/C++size(),sizeof(),length(),strlen() 对比分析详解

简介: C/C++size(),sizeof(),length(),strlen() 对比分析详解



题目

Complete the solution so that it returns true if the first argument(string) passed in ends with the 2nd argument (also a string).

写一个函数,如果传入的第一个参数(字符串)以第二个参数(也是一个字符串)结尾,则它返回 true。

例子:

solution('abc', 'bc') // returns true

solution('abc', 'd') // returns false

代码区:

#include <stdbool.h>

boolsolution(constchar*string, constchar*ending)

{

   returntrue;

}

#include <string>

boolsolution(std::stringconst&str, std::stringconst&ending) {

   returntrue;

}

解答

CPP

#include <string>


bool solution(const std::string& str, const std::string& ending) {

 return str.size() >= ending.size() && str.compare(str.size() - ending.size(), std::string::npos, ending) == 0;

}

bool solution(std::string const &str, std::string const &ending) {

   return (std::string(str.end() - ending.size(), str.end()) == ending);

}

bool solution(std::string const &str, std::string const &ending) {

   const int slen = str.length();

   const int eLen = ending.length();

   

   if (slen < eLen) {

       return false;

   }

   

   for (int i = 1; i <= eLen; i++) {

       if (str[slen - i] != ending[eLen - i]) {

           return false;

       }

   }

   return true;

}

C

#include <stdbool.h>

#include <string.h>


bool solution(const char *string, const char *ending)

{

   int len = strlen(string) - strlen(ending);

   return len < 0 ?false :strcmp(string + len, ending) == 0;

}

#include <stdbool.h>

#include <string.h>


bool solution(const char *string, const char *ending)

{

   int slen = strlen(string);

   int elen = strlen(ending);

   

 

   if (slen < elen) return false;

   

 

   int y = 0;

   for(int x = slen - elen; x <= slen; ++x)

   {

       if(string[x] != ending[y])

       {

         return false;

       }

       ++y;

   }

   return true;

}

#include <stdbool.h>


bool solution(const char *string, const char *ending) {

   int str1 = strlen(string);

   int str2 = strlen(ending);

   

   return str1 >= str2 ? 0 == memcmp(&string[str1 - str2], ending, str2) : false;

}

D

#include<iostream>

using namespace std;


bool solution(string const& str, string const& ending) {

int n1 = strlen(str.c_str());//获取字符串长度

int n2 = strlen(ending.c_str());

int flag = 0;

 

for (int i = n1 - n2  ; i < n1; i ++)

{

if (str[i] == ending[flag]) flag ++;

else return false;

}

if (flag = n2)return true;

 

}


int main()

{

 

string str , ending;

cin >> str; cin >> ending;

cout<<solution(str, ending);

system("pause");

return 0;

}

PS

strlen()函数

strlen()函数 用于 计算 指定字符串的 长度,但 不包括 结束字符(打印字符串长度)。

注意事项:

#define _CRT_SECURE_NO_WARNINGS 1                        

                                                                                                            #include <stdio.h>    

#include <string.h>                                  

                                                                                                           

int main()                                                                                            

{                                                                                                          

  char arr1[] = "abc";

  // "abc" -- 'a' 'b' 'c' '\0'        

  // '\0'是字符串的结束标志

 

  char arr2[] = {'a', 'b', 'c'};

  // 'a' 'b' 'c'

  //区别是无'\0',导致错误

   

  printf("%s\n", arr1);//输出abc

  printf("%d\n", strlen(arr1));//输出3        

 

  printf("%s\n", arr2);//输出乱码                                                            

  printf("%d\n", strlen(arr2));//输出乱数                                        

  return 0;                                                                                

}                  

"abc" 结尾默认包含 'a' 'b' 'c' '\0' ,而'a' 'b' 'c',区别是无'\0'。

优化方案:

   char arr2[] = {'a', 'b', 'c', 0};// 'a' 'b' 'c' '\0'

结论:

结论:字符串的结束标志是一个" \0 "的转义字符。在计算字符串长度的时候" \0 "是结束标志,不算字符串内容。如果没有结束标志,则程序可能沿着数组在内存中的位置不断向前寻找,直到遇见空字符才会停止。可能会导致输出的内容变多,计算长度时过长。

strcmp()函数

将指定的两个字符串进行比较。

声明:

int strcmp(const char *str1, const char *str2)

参数:

str1 – 要进行比较的第一个字符串。str2 – 要进行比较的第二个字符串。

返回值:(比较指定的ASCII值)

如果 str1 < str2返回值为 < 0的数如果 str2 > str1返回值为 > 0的数如果 str1 = str2返回值为  0

原理:

strcmp()函数是根据ACSII码的值来比较两个字符串的;strcmp()函数首先将s1字符串的第一个字符值减去s2第一个字符,若差值为零则继续比较下去,接着比较第二个字符然后第三个字符等等,若差值不为零,则停止比较并返回两个ASCII码差值。

无论两个字符串是什么样,strcmp函数最多比较到其中一个字符串遇到结束符'/0'为止,得出结果。

注意:

strcmp(const char *s1,const char * s2)这里面只能比较字符串,即可用于比较两个字符串常量,或比较数组和字符串常量,不能比较数字等其他形式的参数。

size(),sizeof(),length(),strlen()对比分析

(1)size()和sizeof()

使用范围:

C++中size()函数除了跟length()函数一样可以获取字符串长度之外,还可以获取vector类型的长度。size()主要是进行元素个数的计算,传入的参数一定要是一个数组。不能是单个变量或者是指针。

stringstr="ADAS";

vector<int>num(10,5)

intlenstr=str.size();

intlenvec=num.size();

//lenstr = 4; lenvec = 10

sizeof()主要是进行所占字节大小的计算,不管传进的参数是什么,它是运算符不是函数。

(2)length()和strlen()

使用范围:

两者都是针对的字符串计算大小

C++中length()函数只能用来获取字符串长度(用于string),类似于size()计算的是元素的个数

stringstr="ADAS";

intlen=str.length();//len = 4


目录
相关文章
|
7月前
|
算法 安全 编译器
【C++ 泛型编程 进阶篇】C++模板参数推导的场景分析
【C++ 泛型编程 进阶篇】C++模板参数推导的场景分析
106 0
【C++ 泛型编程 进阶篇】C++模板参数推导的场景分析
|
3月前
|
程序员 编译器 C++
【C++核心】C++内存分区模型分析
这篇文章详细解释了C++程序执行时内存的四个区域:代码区、全局区、栈区和堆区,以及如何在这些区域中分配和释放内存。
58 2
|
1月前
|
Ubuntu Linux Shell
C++ 之 perf+火焰图分析与调试
【11月更文挑战第6天】在遇到一些内存异常的时候,经常这部分的代码是很难去进行分析的,最近了解到Perf这个神器,这里也展开介绍一下如何使用Perf以及如何去画火焰图。
|
2月前
|
存储 算法 搜索推荐
对二叉堆的简单分析,c和c++的简单实现
这篇文章提供了对二叉堆数据结构的简单分析,并展示了如何在C和C++中实现最小堆,包括初始化、插入元素、删除最小元素和打印堆的函数,以及一个示例程序来演示这些操作。
42 19
|
6月前
|
存储 程序员 编译器
C/C++堆栈详细分析,新老程序员必会
C/C++堆栈详细分析,新老程序员必会
197 1
|
2月前
|
Ubuntu Linux Shell
C++ 之 perf+火焰图分析与调试
【10月更文挑战第8天】在遇到一些内存异常的时候,经常这部分的代码是很难去进行分析的,最近了解到Perf这个神器,这里也展开介绍一下如何使用Perf以及如何去画火焰图。
|
6月前
|
存储 自然语言处理 安全
C++ STL标准库 《string原理与实战分析》
C++ STL标准库 《string原理与实战分析》
99 0
|
3月前
|
Ubuntu Linux Shell
C++ 之 perf+火焰图分析与调试
简介 在遇到一些内存异常的时候,经常这部分的代码是很难去进行分析的,最近了解到Perf这个神器,这里也展开介绍一下如何使用Perf以及如何去画火焰图。 1. Perf 基础 1.1 Perf 简介 perf是Linux下的一款性能分析工具,能够进行函数级与指令级的热点查找。利用perf剖析程序性能时,需要指定当前测试的性能时间。性能事件是指在处理器或操作系统中发生的,可能影响到程序性能的硬件事件或软件事件 1.2 Perf的安装 ubuntu 18.04: sudo apt install linux-tools-common linux-tools-4.15.0-106-gen
|
7月前
|
算法 安全 大数据
【C/C++ 随机函数行为】深入探索C++中的随机数:std::random_device与rand的行为分析(二)
【C/C++ 随机函数行为】深入探索C++中的随机数:std::random_device与rand的行为分析
203 0
|
5月前
|
机器学习/深度学习 算法 C++
C++多态崩溃问题之为什么在计算梯度下降时需要除以批次大小(batch size)
C++多态崩溃问题之为什么在计算梯度下降时需要除以批次大小(batch size)