字符串的一个小测试

字符串即若干字符组成的序列,每个字符串都以‘\0’结尾,由于这个特点,每个字符串都有一个额外的字符开销,所以要注意字符串越界的问题。

如:

char str[10];
strcpy(str,"0123456789");//越界

同时,很多函数如strcpy、strlen、strcmp、strstr等字符串函数都是用了这个特点实现。

为节省内存,c和c++把常量字符串放到了静态区,当几个指针赋值给相同的的字符串常量时,它们会指向相同的地址。但用常量初始化数组则不同

char a1[]="hello word";
char a2[]="hello word";//a1和a2地址不同

char *p1="hello word";
char *p2="hello word";//p1和p2地址相同,p1和p2均指向“hello word”这个空间

ps:常量具有只读属性

char a1[]="hello word";
a1[5]=‘,‘;//正确,可更改元素
char *p="hello word";
p[5]=‘,‘;//错误,*p指向一个常量,不可更改

练习:

实现一个函数,把字符串中每个空格替换成“%20”。

例:输入“we are happy”

输出“we%20are%20happy”

实现方法2.0

考虑从尾部一个一个向后移,先遍历字符串,统计空格个数,由于计算新字符串长度(每替换一个空格,长度+2),遇到空格就替换,时间复杂度O(n),利用数组下标即可以实现字符的移动

#include<iostream>
#include<assert.h>
#include<string.h>
using namespace std;

void ReplaceBlank(char *str)
{
	assert(str);//断言str不为空

	int blank = 0;//空格数
	char *p = str;
	size_t length = strlen(str);

	while (*p != ‘\0‘)
	{
		if (*p == ‘ ‘)//遍历查找空格个数
			blank++;
		p++;
	}
	size_t newlen = blank * 2 +length;//替换空格为%20的新长度

	while (newlen>length)
	{
		if (str[length] != ‘ ‘)
		{
			str[newlen] = str[length];
			newlen--;
			length--;
		}
		else
		{
			str[newlen--] = ‘0‘;
			str[newlen--] = ‘2‘;
			str[newlen--] = ‘%‘;//新长度减3
			length--;//原长度减一(空格)
		}
	}
}

实现方法2.1:

上面使用数组实现,同样,指针也可以做到。用一个指针p1指向字符串末尾,另一个p2指向替换之后的字符串的末尾。向前移动指针p1,逐个移动到p2指向的空间,直到碰到空格,把p1向前移动一格,在p2前插入“%20”,当p1和p2指向同一位置,替换完毕

void ReplaceBlank(char str[])
{
	assert(str);

	size_t length = strlen(str);
	size_t blank = 0;//空格个数
	size_t i = 0;

	while (str[i] != ‘\0‘)
	{
		if (str[i] == ‘ ‘)
			blank++;
		i++;
	}

	if (blank == 0)
		return;

	size_t newlen = blank * 2 + length;
	char*p1 = str + length;
	char*p2 = str + newlen;

	while (p1!=p2)
	{
		if (*p1 != ‘ ‘)
		{
			*p2 = *p1;
			p1--;
			p2--;
		}
		else
		{
			p1--;
			*p2-- = ‘0‘;
			*p2-- = ‘2‘;
			*p2-- = ‘%‘;
		}
	}
}

测试方法

1.空格分别在字符串中间和最后

2.无空格

3.空字符串

测试
void test()
{
	char str[20] = "we are happy";
	cout << str << endl;
	ReplaceBlank(str);
	cout << str << endl;
}
int main()
{
	test();
	getchar();
	return 0;
}
时间: 2024-12-19 20:47:58

字符串的一个小测试的相关文章

object-c编程tips-global_queue的一个小测试

前一段进行网络基础库构建的时候,网络发送的加密组包以及网络返回的回调解包处理都是在单独的主线程处理. 跟踪程序的时间发现这部分耗时还挺大,于是决定使用多线程处理,至少不应该使用主线程. 一直以来网上都在强调多线程的dispatch的妙用,自己仅仅是会用而没有实际测试过它的性能.今天将上次测试的结果发出来,说实话dispatch的多线程效率确实很高,跟cpu的核心数有很多关系. 测试思想: 使用一个自己写的耗时函数,让其执行一次所需要的时间进行记录.然后使用dispatch_global_queu

[UNet]通过一个小测试了解Command和ClientRpc的功能

作者只是业余时间接触Unity 2个月的新人一枚,如有不对的地方,请各位大神指正! Unity 5.以后使用了新的网络模块UNet(其实我接触的晚压根没用过老的- -!),但是在使用过程中确实关于UNet的资料和讨论挺少的,于是自己做了个小项目测试了Command和ClientRpc两个命令. 首先我们看看官方给出的定义: Commands Commands are sent from player objects on the client to player objects on the s

字符串的一个小细节

就是在今天,发现了一个问题 "0_0 (: /-\ : ) 0-0".replace(/\s/g,'') 结果是"0_0(:/-:)0-0" 本来只是想把空白符删掉的,可是为什么"\"也会被替换掉 忽略了一个小细节,字符串中"\"是转义字符,是无法显示出来的 "0_0 (: /-\\ : ) 0-0".replace(/\s/g,'') 如果是这样就可以达到想要的效果了

关于cout的一个小测试

以前知道使用cout<<endl换行会刷新缓冲区,但是从来也没在意过这个问题,早上起来翻书看到关于这方面的东西就来做了个测试,不做不知道,一测下一跳啊- -! 测试代码: /** 吉林大学 Jilin U Author: sinianluoye (JLU_LiChuang) Date: 2015-3 Usage: **/ #include <iostream> #include <cstdio> #include <cstring> #include <

Python下实现文件中的全文搜索小测试

username = 'test' password = '123456' while True: user_str = raw_input("Please input your name>>") pass_str = raw_input("Please input your password>>") if username != user_str or password != pass_str: print "Sorry,You 

Java正则表达式——测试正则表达式的一个小工具

正则表达式是一种强大而灵活的文本处理工具.使用它我们能以编程的方式,构造复杂的文本模式,并对输入的字符串进行搜索.一旦找到了匹配这些模式的部分,你就能够随心所欲地对它们进行处理. 关于正则表达式的语法,网上对此有介绍的文章实在是多不胜数,实在找不到,还可以查看Java的API文档,就不多介绍了.这里主要介绍一个可以测试正则表达式的小工具.直接上代码: 1 package com.test.stringregex; 2 //{Args: abcabcabcdefabc "abc+" &q

使用eval()将json字符串转换为对象要多加一个小括号

使用eval()将json字符串转换为对象要多加一个小括号:关于eval()函数的具体用法这里就不多介绍了,具体可以参阅javascript的eval()方法一章节,下面就介绍一下为什么使用eval()函数将json格式字符串转换为对象的时候,需要多嵌套一层小括号,下面就介绍一下它的原因,希望能够对需要的朋友带来帮助.先看一段转换代码: var jsonStr='{"webName":"蚂蚁部落","webAddress":"青岛市南区

输入5个学生的名字(英文),使用冒泡排序按从大到小排序。 提示:涉及到字符串数组,一个字符串是一个一维字符数组;一个 字符串数组就是一个二维字符数组。

#include <stdio.h>#include <string.h> /*输入5个学生的名字(英文),使用冒泡排序按从大到小排序.提示:涉及到字符串数组,一个字符串是一个一维字符数组:一个字符串数组就是一个二维字符数组.*/ void main(){ char stuNames[5][100]; char tmp[100]; int i = 0,j = 0; for(i = 0; i < 5; i++) { printf("请输入第%d个学生的名字:"

一个字符串排列的小算法

给定n个A和2n个B,用这些字符拼成一个字符串,要求这个串的所有前缀和后缀B的个数始终不少于A. (一个字符串的前缀是只从开头到某个位置为止的子串,后缀是只从某个位置到结尾的子串). 输入格式 多组数据,每组数据只有一行,包含一个正整数n.(n<=10^17). 输出格式 每组数据输出一行,最终结果对99991取余数的结果. def count(n,m,ac,bc,sb):    if(ac==n or bc==m):        print sb;        return 1;    i