1. 程式人生 > >c::用字串代替空格f

c::用字串代替空格f

1、題目要求:

請實現一個函式,把字元陣列中的每個空格替換成“%20”。

2、分析:

1)想法一:我們可以再建立一個數組,當遇到空格的時候,就將所要替換的字串一個一個放進去,這種方法當然可行,但是效率低又造成空間的浪費,所以我們不採取這種方法。

2)想法二:從前往後:在原基礎上進行替換(空間是足夠的),如果從前往後遇到空格就進行替換,必然後對原來的字元造成覆蓋,不可以實現

3)想法三:從後往前:倒著遇到空格就玩夠移動同時用字串進行替換,如果全部都是空格的話,那勢必造成時間複雜度O(n^2)的開銷,可以實現的,但是做法不是很佳

4)想法四:因為我們要進行的是將字串“%20”替換空格,所以我們可以利用如下的方式

     *先統計出源字串中空格的個數

     *然後根據要替換的字串中字元的個數和統計出的空格的個數的關係:

                 源字串中空格的個數*2+2=替換後字串中空格的個數

     *我們將源字串的末尾記錄下來,將替換後字串的末尾記錄下來,當源字串的末尾不為空格的時候,就將源字串對應的字元賦給替換後的字串末尾指向的對應位置,否則就進行新增‘0’,‘2’,‘%’,這三個字元,然後源字串末尾指標繼續向前移動,最終結束的時候就是這兩個指標相遇的時候。

       說了這麼一大段,大家估計雲裡霧裡,我用圖來進行說明下:(我這裡給的源字串是“we are happy.”)


      兩個指標一直在往左走最終相遇,替換完成

      *程式碼實現:

/*函式說明:
請實現一個函式,把字元陣列中的每個空格替換成“%20”。
例如輸入“we are happy.”,則輸出“we%20are%20happy.”。
*/
#include<stdio.h>


void Replace(char *a)
{
	char *str = a;
	int *end = NULL;
	int *new_end = NULL;
	int count = 0;
	while(*str != '\0')
	{
		if(*str == ' ')
		{
			count++;
		}
		str++;
	}
	end = str-1;
	new_end = count*2+end;
	while(end != new_end)
	{
		if(*end != ' ')
		{
			*new_end-- = *end--;
		}
		else
		{
			*new_end-- = '0';
			*new_end-- = '2';
			*new_end-- = '%';
			end--;
		}
	}
	
}
int main()
{
	char *a = "we are happy";
	printf("%s\n",a);
	Replace(a);
	printf("%s\n",a);
	//printf("%d\n",Blank_count(a));
	return 0;
}


相關推薦

c::字串代替空格f

1、題目要求: 請實現一個函式,把字元陣列中的每個空格替換成“%20”。 2、分析: 1)想法一:我們可以再建立一個數組,當遇到空格的時候,就將所要替換的字串一個一個放進去,這種方法當然可行,但是效率

1.輸入字串%20代替空格並返回字串

2018-11-13 問題描述: 輸入字串,用%20代替空格並返回字串 思路:    1.使用字串的replaceAll()方法,達到物盡其用的目的;    2.自己編寫方法,實現該功能   思路1的程式碼: 1 package zhangchaolun.test; 2 i

c語言-字串空格

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <strin

C#---將字串空格分隔

string[] line = System.Text.RegularExpressions.Regex.Replace(strline.Trim(), @"[\s]+", " ").Split(" "

C++字串組成心形圖案的嘗試

在網上看到好多有奇特圖案的函式,比如這個公式,能繪出這樣的心形圖案。 為了用字元把心形區域填滿,只需要設定for迴圈用x和y表示出一個方形畫布區域,如果左邊表示式的值不大於右邊表示式1,則說明座標位於心形區域內,以字元填充之,否則用空格填充區域外的部分。 除此之外,要將字

BMP轉成C語言陣列檔案工具(image2lcd代替bmp2h exe)

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

c# 正則表示式獲取開始和結束字串中間的值

/// <summary> /// 獲得字串中開始和結束字串中間得值 /// </summary> /// <param name="str">字串</param> /// <param name="s">開始</param>

C++】C++行內函數也可以代替巨集

巨集是可以帶引數的,它在形式上和函式非常相似。不過不像函式,巨集僅僅是字串替換,不是按值傳遞,所以在編寫巨集時要特別注意,一不小心可能就會踩坑。 #define SQ(y) y*y 當n = 9 時,SQ(n) = 81 如果把SQ(n)換成SQ(n+1)卻得不到1

C++(二十四) — 指向字元的指標為什麼可以字串來初始化,而不是字元地址?

一、C語言中,為什麼字串可以賦值給字元指標變數? char *p; a='5'; p=&a; //顯然是正確的, p="abcd"; //但為什麼也可以這樣賦值?? 問:一直理解不了為什麼可以將字串常量賦

C 實現字串按多個字符采Split方法分割

using System.Text.RegularExpressions;string str="aaajsbbbjsccc";string[] sArray=Regex.Split(str,"js",RegexOptions.IgnoreCase);foreach (string i in sArray)

C/C++中輸入帶空格字串用法總結

(1)gets(char *str)     需要包含標頭檔案#include <stdio.h> (2)scanf("%[^\n]]",str)     需要包含標頭檔案#include <stdio.h>

C語言輸入帶空格字串

用scanf("%s",array); 的話遇到空格就停止接收後面的字元了,那怎麼才能接收帶空格的字串呢? 1.用 gets() ,它可以接收帶空格的字串, 直到回車才結束輸入 char buf[80]={0};  gets(buf);   //可以讀取空格, 回車結

C++去除字串中多餘的空格

今天寫了個小程式設計,去除字串中多餘的空格,例如"I___am_____a______student."(下劃線表示空格哈,打多個空格顯示的還是一個),最後輸出”I am a student.” 現在把自己的思路貼上,歡迎大家留言指正。 思路就是定義兩個指標

C++如何輸入含空格字串

1、scanf函式(包含標頭檔案#include <stdio.h>)   scanf函式一般格式為scanf(“%s”,st),但scanf預設回車和空格是輸入不同組之間的間隔和結束符號,所以輸入帶空格,tab或者回車的字串是不可以的。解決方法如下: 1)利用格

c語言】字串替換空格:請實現一個函式,把字串中的每個空格替換成“%20”

// 字串替換空格:請實現一個函式,把字串中的每個空格替換成“%20”。 // 例如輸入“we are happy.”,則輸出“we%20are%20happy.” #include <stdio.h> #include <assert.h>

C語言:使用命令列引數字串讀取流和輸出流進行文字檔案的複製

#include<stdio.h> int main(int argc,char *argv[]) {   //檢查使用者的引數是否正確   if(argc<3)   {     printf("用法:命令 原始檔名 目標檔名\n");     return -1;

c# 字串拆分 ;c# 中字串中的分號逗號替換;SQL Server 字串中的分號逗號替換

1、string[] ids = extData.Split(new char[] { ';' });2、extData.Replace(";", "','"); string.Format(strSQL, extData.Replace(";", "','"))3、1 se

C++11新特性,實現字串作為switch的case子句

有時候,我們想寫出下面這樣的switch語句: const char* str = "first";  switch(str){  case "first":  cout << "1st one" << endl; 

C++連續輸入帶空格字串

測試檔案 測試1 #include <stdio.h> #include <iostream> #include <string> using namespa