一,c/c++字符串

1.C/C++中每个字符串都以字符’\0‘作为结尾,这样我们就能很方便地找到字符串的最后尾部。

由于这个原因每个字符串都有一个额外的开销,注意字符串越界的问题;

2.C/C++内存模型把字符串常量放到单独的一个内存区域;

当几个指针指向相同的字符串常量的时候,他们实际上会指向常量区那个的内存地址;

但是用字符串常量初始化数组,情况却不一样,这点很重要,考察你C能力的筹码;

test.c:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 
#include <stdio.h>

int main()
{
    char str1[] = "hello world";
    char str2[] = "hello world";

char *str3 = "hello boy";
    char *str4 = "hello boy";

if(str1 == str2)
    {
        printf("str1 and str2 are same.\n");
    }
    else
    {
        printf("str1 and str2 are not same\n");
    }

if (str3 == str4)
    {
        printf("str3 and str4 are same.\n");
    }
    else
    {
        printf("str3 and str4 are not same.\n");
    }
    return 0;
}

运行结果:

str1 and str2 are not same
str3 and str4 are same.

Makefile:

1
2
3
4
5
6
7
8
9
10
11
12
 
.PHONY:clean  
CC=gcc  
CFLAGS=-Wall -g  
BIN=test  
OBJS=test.o  
LIBS=  
$(BIN):$(OBJS)  
    $(CC) $(CFLAGS) $^ -o $@ $(LIBS)  
%.o:%.c  
    $(CC) $(CFLAGS) -c $< -o $@  
clean:  
    rm -f *.o $(BIN)  

str1和str2是两个字符串数组,我们会为他们分配两个长度为12个字节的空间(在栈区),

并且把常量区的“hello world”的内容分别拷贝的数组当中。

这是两个初始地址不同的数组;

str3和str4是两个指针,我们无须为她们分配内存来存储字符串的内容,而只需要把他们指向“hello boy”在常量区中的地址就可以了,“hello world”这个字符串常量在内存中只有一个拷贝,因此str3与str4的值是一样的。

二,替换空格

给定字符串中的空格替换成 ’%20‘

思路就是计算出替换后的字符串的长度,利用两个指针,一个指向就字符串的末尾,一个指向新字符串的末尾;

进而从后往前面遍历,这样子节约时间,移位的效率高,因为没有做多余的移位操作;

space.cpp:

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
 
#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;

/*length 为字符数组string的总的容量*/
void ReplaceBlank(char string[], int length)
{

if(string == NULL && length <= 0)
    {
        return;
    }

/*originalLength为字符串string的实际长度*/
    int originalLength = 0;
    int numberOfBlank = 0;
    int i = 0;
    while(string[i] != '\0')
    {
        ++ originalLength;

if(string[i] == ' ')
        {
            ++ numberOfBlank;
        }

++ i;
    }

/*newLength为把空格替换成‘%20’后的长度*/
    int newLength = originalLength + numberOfBlank * 2;
    if (newLength > length)
    {
        return ;
    }

int indexOforiginal = originalLength;
    int indexOfNew = newLength;
    while(indexOforiginal >= 0 && indexOfNew > indexOforiginal)
    {
        if(string[indexOforiginal] == ' ')
        {
            string[indexOfNew --] = '0';
            string[indexOfNew --] = '2';
            string[indexOfNew --] = '%';
        }
        else
        {
            string[indexOfNew --] = string[indexOforiginal];
        }
        -- indexOforiginal;
    }

}

void Test(char *testName, char string[], int length, char expected[])
{
    if(testName != NULL)
        printf("%s begins: ", testName);

ReplaceBlank(string, length);

if(expected == NULL && string == NULL)
    {
        cout << "passed." << endl;
    }
    else if(expected == NULL && string != NULL)
    {
        cout << "failed." << endl;
    }
    else if(strcmp(string, expected) == 0)
    {
        cout << "passed." << endl;
    }
    else
    {
        cout << "failed." << endl;
    }
}

int main()
{
    const int length = 100;

char string[length] = "hello world";
    char expected[] = "hello%20world";

ReplaceBlank(string, length);

if(strcmp(string, expected) == 0)
    {
        cout << "passed." << endl;
    }
    else
    {
        cout << "failed." << endl;
    }

return 0;
}

运行结果:

passed.  

Makefile:

1
2
3
4
5
6
7
8
9
10
11
12
 
.PHONY:clean  
CPP=g++  
CFLAGS=-Wall -g  
BIN=test  
OBJS=space.o  
LIBS=  
$(BIN):$(OBJS)  
    $(CPP) $(CFLAGS) $^ -o $@ $(LIBS)  
%.o:%.cpp  
    $(CPP) $(CFLAGS) -c $< -o $@  
clean:  
    rm -f *.o $(BIN)Test1 begins: passed.  

【面试题004】c/c++字符串,替换空格的更多相关文章

  1. 【C语言】字符串替换空格:实现一个函数,把字符串里的空格替换成“%20”

    //字符串替换空格:实现一个函数,把字符串里的空格替换成"%20" #include <stdio.h> #include <assert.h> void ...

  2. 【c语言】字符串替换空格:请实现一个函数,把字符串中的每一个空格替换成“%20”

    // 字符串替换空格:请实现一个函数,把字符串中的每一个空格替换成"%20". // 比如输入"we are happy.",则输出"we%20are ...

  3. 剑指offer 2.字符串 替换空格

    题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. public class Re ...

  4. 【Offer】[5] 【替换空格】

    题目描述 思路分析 Java代码 代码链接 题目描述 请实现一个函数,把字符串中的每个空格替换成"%20". 例如输入"We are happy.",则输出&q ...

  5. 《剑指offer面试题4》替换空格——实现函数把字符串中每个空格替换成“%20”

    思路: 例如把we are happy这个字符串中所有空格替换成"%20",最直接的做法是从头开始扫苗,遇到空格就替换,并且把空格后面的字符都顺序后移.复杂度O(n^2). 重要思 ...

  6. 剑指Offer:面试题4——替换空格(java实现)

    问题描述:请实现一个函数,把字符串中的每个空格替换成"%20". 例如: 输入:"We are happy." 输出:"We%20are%20happ ...

  7. C++版 - 剑指offer 面试题4: 替换空格 题解

    面试题4:替换空格 提交网址: http://www.nowcoder.com/practice/4060ac7e3e404ad1a894ef3e17650423?tpId=13&tqId=1 ...

  8. 剑指offer编程题Java实现——面试题4替换空格

    题目描述 请实现一个函数,将一个字符串中的空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. package Solution; ...

  9. 【剑指Offer面试题】 九度OJ1510:替换空格

    c/c++ 中的字符串以"\0"作为结尾符.这样每一个字符串都有一个额外字符的开销. 以下代码将造成内存越界. char str[10]; strcpy(str, "01 ...

随机推荐

  1. 9款基于HTML5/SVG/Canvas的折线图表应用

    1.华丽的HTML5图表 可展示实时数据 HTML5在图表应用中也十分广泛,比起以前的网页图表,HTML5图表制作更便捷,功能更强大.这款HTML5图表插件外观十分华丽和专业,在数据展示方面也很有优势 ...

  2. VS默认环境设置

    VS2010的工具菜单-->导入导出设置-->重置所有设置

  3. 关于java的转义字符

    关于java的转义字符 我们都知道  String s="ad,dfjdlfs,df,s,dfl";              执行 String re[]=s.split(&qu ...

  4. ListBox复选框拓展

    Toolkit的LongListMutiSelector的复选框功能,想必许多人都需要吧!然而系统本身控件ListBox虽然也有多选功能,可是外观上却缺乏复选框,选择效果只是颜色变化.于是在上一个项目 ...

  5. [大牛翻译系列]Hadoop(10)MapReduce 性能调优:诊断reduce性能瓶颈

    6.2.3 Reduce的性能问题 Reduce的性能问题有和map类似的方面,也有和map不同的方面.图6.13是reduce任务的具体的执行各阶段,标识了可能影响性能的区域. 这一章将介绍影响re ...

  6. 为 WordPress 标签添加 rel="nofollow" 属性

    WordPress 标签默认并无 rel="nofollow" 属性.rel="nofollow" 属性的作用是:告诉搜索引擎,无需追踪目标页,禁止蜘蛛爬行和传 ...

  7. 通过xsd生成xml类

    步骤二:使用VS2010 Tools中的命令提示窗口 如下图所示 执行结果:生成myschema.xsd对应的C#类文件. 命令剖析: /c  生成对应的类文件 /l:cs 类文件使用C#语言 /ou ...

  8. 通过 Javacore 了解线程运行状况

    Javacore 是一个当前 JVM 运行状态的快照.通过对Javacore 的分析,可以了解在 JVM 中运行的应用程序的当前状态,比如是否“卡”在某一点上,或在某些代码上运行时间太长. Javac ...

  9. [转]system函数返回值探究

    对于system这个函数的功能早就有一定了解,读书期间,就学习了UNIX系统编程这本书,后来买了APUE.我这个人总是有好读书不求甚解的毛病.对于system函数只知其一,不知其二.后来被人问起相关的 ...

  10. eclipse增加浏览器chrome

    1.安装完了google chrome游览器后,如何让eclipse直接用chrome打开jsp 2.添加到eclipse环境中即可, Window(菜单) -- preferences 增加成功后, ...