首页 > 编程语言 >C++学习笔记(27)

C++学习笔记(27)

时间:2024-09-20 20:55:34浏览次数:9  
标签:src 27 dest 笔记 char ii C++ str 字符串

十一、把字符串转换成整数
有两个任务:
1)为了支持把 C 风格的字符串转换成数字,C++提供了以下四个函数:
int atoi(const char *_String); // 把 C 风格字符串转换为 int 整数。
long atol(const char *_String); // 把 C 风格字符串转换为 long 整数。
long long atoll(const char *_String); // 把 C 风格字符串转换为 long long 整数。
double atof(const char *_String); // 把 C 风格字符串转换为 double 浮点数。
注意:a)如果字符串中间有非法字符,后面的内容将丢弃;b)如果字符串的第一个字符非法或字
符串为空,将返回 0。
2)从界面上输入一个 C 风格的字符串(二进制或十进制),把它转换成整数,类似 atoi()函数。
"4358" int result=0; // 转换的结果。
第一次:把字符4拿出来
result='4'-'0'; 4
第二次:把字符3拿出来
result=result*10; 40
result=40 + '3'-'0' 43
第三次:把字符5拿出来
result=result*10; 430
result=430 + '5'-'0' 435
第四次:把字符8拿出来
result=result*10; 4350
result=4350 + '8'-'0' 4358
循环结束
示例:
#include <iostream>
using namespace std;
int main()
{
// 从界面上输入一个 C 风格的字符串(二进制或十进制),把它转换成整数,类似 atoi()函数。
char str[21];
memset(str, 0, sizeof(str));
cout << "请输入一个由数字组成的字符串:"; cin >> str;
int radix;
cout << "请选择(2-二进制;10-十进制):"; cin >> radix;
int result = 0; // 转换后的结果。
for (int ii = 0,len= strlen(str); ii < len; ii++)
{
if (str[ii]<'0' || str[ii]>'9') { cout << "字符串非法(包含非数字字符)。\n"; break; }
if (radix==2 && str[ii] > '1') { cout << "字符串非法(只能是 0 和 1)。\n"; break; }
result = result * radix;
result = result + str[ii] - '0';
}
cout << "转换的结果是:" << result << endl;
}
十二、实现 strcpy()和 strncpy()函数
示例:
#define _CRT_SECURE_NO_WARNINGS // 使用 C 风格字符串操作的函数需要定义这个宏
#include <iostream>
using namespace std;
// 功 能 : 将参数 src 字符串拷贝至参数 dest 所指的地址。
// 返回值 : 返回参数 dest 的字符串起始地址。
// 复制完字符串后,会在 dest 后追加 0。
// 如果参数 dest 所指的内存空间不够大,会导致数组的越界。
char* mystrcpy1(char* dest, const char* src)
{
long long ii = 0, jj = 0; // 目标字符串和源字符串的下标计数器。
while (src[jj]) // 如果源字符串还没有结束。
dest[ii++] = src[jj++]; // 把源字符串中的字符一个一个的复制到目标字符串中。
dest[ii] = 0; // 把目标字符串加上结尾标志 0。
return dest; // 返回目标字符串。
}
char* mystrcpy2(char* dest, const char* src)
{
char* pdest = dest; // 指向目标字符串。
char* psrc = (char*)src; // 指向源字符串。
while (*psrc) // 如果目标字符串还没有结束。
*pdest++ = *psrc++; // 把源字符串中的字符一个一个的复制到目标字符串中。
*pdest = 0; // 把目标字符串加上结尾标志 0。
return dest; // 返回目标字符串。
}
char* mystrcpy3(char* dest, const char* src)
{
memcpy(dest, src, strlen(src) + 1); // 一次复制整块内存。
return dest; // 返回目标字符串。
}
// 功能:把 src 前 n 个字符的内容复制到 dest 中。
// 返回值:dest 字符串起始地址。
// 如果 src 字符串长度小于 n,则拷贝完字符串后,在 dest 后追加 0,直到 n 个。
// 如果 src 的长度大于等于 n,就截取 src 的前 n 个字符,不会在 dest 后追加 0。
// 如果参数 dest 所指的内存空间不够大,会导致数组的越界。
char* mystrncpy(char* dest, const char* src, const size_t n)
{
memcpy(dest, src, n); // 一次复制整块内存。
*(dest + n) = 0; // 加上字符串的结尾标志。
// dest[n]=0; // 加上字符串的结尾标志。
return dest; // 返回目标字符串。
}
#include <chrono> // 时间操作库的头文件。
int main()
{
//char str[51];
memset(str, 0, sizeof(str));
//mystrncpy(str, "aaaaaaaaa", 3);
//cout << str << "=" << endl;
//return 0;
std::chrono::steady_clock::time_point start, end; // start-计时开始,end-计时完成。
std::chrono::nanoseconds dt; // 时间差。
start = chrono::steady_clock::now(); // 开始计时。
char str1[51];
memset(str1, 0, sizeof(str1));
for (int ii = 0; ii < 10000000; ii++)
mystrcpy1(str1, "我是一只傻傻鸟,不是笨笨鸟,你才是笨笨鸟。1");
cout << str1 << endl;
end = chrono::steady_clock::now(); // 计时完成。
dt = end - start; // 计算时间差。
cout << "耗时: " << (double)dt.count() / (1000 * 1000 * 1000) << "秒。\n"; // 显示
消耗的时间。
start = chrono::steady_clock::now(); // 开始计时。
char str2[51];
memset(str2, 0, sizeof(str2));
for (int ii = 0; ii < 10000000; ii++)
mystrcpy2(str2, "我是一只傻傻鸟,不是笨笨鸟,你才是笨笨鸟。2");
cout << str2 << endl;
end = chrono::steady_clock::now(); // 计时完成。
dt = end - start; // 计算时间差。
cout << "耗时: " << (double)dt.count() / (1000 * 1000 * 1000) << "秒。\n"; // 显示
消耗的时间。
start = chrono::steady_clock::now(); // 开始计时。
char str3[51];
memset(str3, 0, sizeof(str3));
for (int ii = 0; ii < 10000000; ii++)
mystrcpy3(str3, "我是一只傻傻鸟,不是笨笨鸟,你才是笨笨鸟。3");
cout << str3 << endl;
end = chrono::steady_clock::now(); // 计时完成。
dt = end - start; // 计算时间差。
cout << "耗时: " << (double)dt.count() / (1000 * 1000 * 1000) << "秒。\n"; // 显示
消耗的时间。
}
十三、实现 strcat()和 strncat()函数
示例:
#define _CRT_SECURE_NO_WARNINGS // 使用 C 风格字符串操作的函数需要定义这个宏
#include <iostream>
using namespace std;
// 功能:将 src 字符串拼接到 dest 所指的字符串尾部。
// 返回值:返回 dest 字符串起始地址。
// dest 最后原有的结尾字符 0 会被覆盖掉,并在连接后的字符串的尾部再增加一个 0。
// 如果参数 dest 所指的内存空间不够大,会导致数组的越界。
char* mystrcat(char* dest, const char* src)
{
// abc0 // xyz0
memcpy(dest + strlen(dest), src, strlen(src)+1);
return dest;
}
// 功能:将 src 字符串的前 n 个字符拼接到 dest 所指的字符串尾部。
// 返回值:返回 dest 字符串的起始地址。
// 如果 n 大于等于字符串 src 的长度,那么将 src 全部追加到 dest 的尾部。
// 如果 n 小于字符串 src 的长度,只追加 src 的前 n 个字符。
// strncat 会将 dest 字符串最后的 0 覆盖掉,字符追加完成后,再追加 0。
// 如果参数 dest 所指的内存空间不够大,会导致数组的越界。
char* mystrncat(char* dest, const char* src, const size_t n)
{
size_t len = strlen(dest);
memcpy(dest + len, src, n);
// abc0 aaaaa0 3 abcaaa0
// abc0 a0 3 abca0 0
*(dest + len + n) = 0;
return dest;
}
int main()
{
char str[51];
strcpy(str, "abc");
cout << "str=" << str << endl; // 显示 str=abc
mystrcat(str, "abc");
cout << "str=" << str << endl; // 显示 str=abcabc
mystrncat(str, "aaaaaaaaaaaaa",3);
cout << "str=" << str << endl; // 显示 str=abcabcaaa
mystrncat(str, "b", 3);
cout << "str=" << str << endl; // 显示 str=abcabcaaab
}
 

标签:src,27,dest,笔记,char,ii,C++,str,字符串
From: https://blog.csdn.net/qq_60098634/article/details/142301109

相关文章

  • C++游戏
    宠粉福利!目录1.猜数字2.五子棋3.打怪4.跑酷5.打飞机6.扫雷1.猜数字#include<iostream>#include<cstdlib>#include<ctime>intmain(){std::srand(static_cast<unsignedint>(std::time(0)));//设置随机数种子inttarget=std::rand()%1000+......
  • 31927 – Application Development with .NET
    31927–Application Development with .NET32998- .NET Application DevelopmentSPRING 2024ASSIGNMENT 1– SPECIFICATIONDuedate          Monday23September2024,11:00amDemonstration     Requiredinthelab/tutorialses......
  • 《动手学深度学习》笔记1.6——多层感知机→代码实现
    目录1.感知机2.多层感知机2.1XOR(单分类)2.2为何需要(非线性)激活函数?2.3经典激活函数(Sigmoid、Tanh、ReLU)2.4多类分类2.5多隐藏层2.6调参(两种基本思路)2.7总结3.代码实现(pytorch)3.1从零实现可能的报错与解法3.2简洁实现原视频链接:10多层感知机+......
  • PMP模拟考试第176题笔记
    注:自给自足的重要性:在时间紧迫的情况下,自给自足的团队能够快速适应并独立完成任务。虽然主题专家在特定领域具有深厚的知识和技能,但他们可能依赖于特定的流程或指导,这可能会影响团队的独立性。T型特征的个体(IndividualswhohaveaT-typecharacteristic):T型人才......
  • PMP模拟考试第180题笔记
    注:详细解答原因:假设(Assumptions):假设是项目在规划阶段基于现有信息所作出的预设条件。它们是项目计划和决策的基础,记录在项目文档中,作为重要的项目工件。假设能够帮助团队了解项目的背景和限制条件,因此被视为项目工件。范围基线(Scopebaseline):范围基线是指在项......
  • C++ 多线程知识汇总
    https://zhuanlan.zhihu.com/p/194198073 (防链接失效)程序使用并发的原因有两种:为了关注点分离(程序中不同的功能,使用不同的线程去执行),当为了分离关注点而使用多线程时,设计线程的数量的依据,不再是依赖于CPU中的可用内核的数量,而是依据概念上的设计(依据功能的划分);为了提高性能......
  • 博弈论学习笔记(2024.8.17)
    基本概念博弈定义:在一定条件下,遵守一定的规则,一个或几个拥有绝对理性思维的人或团队,从各自允许选择的行为或策略进行选择并加以实施,并从中各自取得相应结果或收益的过程。举几个例子来说说什么是博弈:经济学:股市是按照这样的方式运行的:每个人可以持有股票,如果抛出过多股票则股......
  • C++学习
    C++学习第三课缺省函数、函数重载与引用C++学习第一课:C++学习须知C++学习第二课:命名空间域C++学习第三课:缺省函数与函数重载文章目录C++学习第三课缺省函数、函数重载与引用前言一、C语言的第二个不足:缺省参数(默认参数)的使用1.当函数有两个及以上形参时的传参规......
  • C++ 多态
    一、多态的概念多态简单来说就是多种形态。多态又分为编译时多态(静态多态)和运行时多态(动态多态)。编译时多态(静态多态)主要就是我们一般讲的函数重载和函数模板。运行时多态,具体点就是去完成某个行为(函数),可以传不同的对象就会完成不同的行为,就达到多种形态。就像我们买火......
  • 【Py/Java/C++三种语言OD独家2024E卷真题】20天拿下华为OD笔试之【模拟】2024E-转骰子
    可上欧弟OJ系统练习华子OD、大厂真题绿色聊天软件戳od1441了解算法冲刺训练(备注【CSDN】否则不通过)文章目录相关推荐阅读题目描述与示例题目描述输入描述输出描述示例一输入输出说明示例二输入输出说明解题思路构建长度为6的数组表......