1. 程式人生 > >C++學習筆記(三)字串

C++學習筆記(三)字串

一、C風格字串

1、字串常量 “Hello World”:C++中所有字串常量都由編譯器自動在末尾新增一個null字元。

2、末尾添加了'\0'的字元陣列

eg.

char s1[] = "Hello";
char s2[] = {'H','e','l','l','o'};
char s3[] = {'H','e','l','l','o','\0'};

s1編譯器會自動新增一個空字元在末尾,所以是C風格的字串,s2不是,只是一個字元陣列。s3是。

3、關於 char str[] ="Hello"; 和char *str1 ="Hello";的區別

str是區域性變數,存放在棧區,可以被修改。而str1是指向字元常量區的指標,是一個字元常量指標,不可以被修改。

二、strlen,strcmp,strcpy,strcat的實現

#include "stdafx.h"
#include"stdlib.h"
#include <string>
#include <stdio.h>
using namespace std;

int StringLength(const char *x)
{
	const char *y = x;
	while (*++y);
	return (y-x-1);
}
int StringLength2(const char *x)
{
	int lenth = 0;
	while (*x)
	{
		lenth++;
		*x++;
	}
	return lenth;
}
int StringCompare(const char *s1, const char *s2)
{
	int ret = 0;
	while (!(ret = *(unsigned char *)s1 - *(unsigned char *)s2)&&*s1)//從最左端開始比較,直到遇到不相等的字元或s1結束
	{
		s1++;
		s2++;
	}
	if (ret < 0) return -1;
	else if (ret>0) return 1;
	return ret;
}
char* StringCopy(char *s1, const char *s2)
{
	
	if (s1 == NULL || s2 == NULL)//檢查指標有效性
		throw "Invalid argument(s)";//丟擲異常
	char *ret = s1;//目標指標已經移動,用ret表明首指標
	while ((*s1++ = *s2++) != '\0');//注意運算子優先順序
	
	return ret;
}
char* StringCat(char *s1, const char *s2)
{
	if (s1 == NULL || s2 == NULL)//檢查指標有效性
		throw "Invalid argument(s)";//丟擲異常
	char *ret = s1;
	while (*s1)//執行到'\0'時,停止進行,當前指標指向'\0',也就是'\0'會被覆蓋,
	{
		s1++;
	}
	while (*s1++ = *s2++);//在s1後接s2
	return ret;
}
int _tmain(int argc, _TCHAR* argv[])
{
	
	string aaa = "Hello";//C++ string型別

	char s4[] = "Hello";//存放在棧,區域性變數,可以被修改。
	char s5[] = "World";
	char *s6 = StringCopy(s4, s5);
	printf("%s\n", s6);
	char *s8 = StringCat(s4, s5);
	printf("%s\n", s8);
	printf("%d\n", StringCompare(s4, s5));
	printf("%d\n", StringLength2(s5));
	
	char *str = "Hello";
	*str++ = 'k';
	printf("%s\n", str);
	char *s2 = "oo";
	printf("%d\n", StringCompare(str, s2));
	printf("%d\n", StringLength2(s2));
	//char *s7 = StringCopy(str, s2); 出錯,*str是指向字元常量區的指標,不可以被修改。
	return 0;
}

三、memcpy和memset

1、memcpy

void *memcpy(void *dest,const void *src, size_t n);

從src所指的記憶體起始地址開始拷貝n個位元組到目標dest所指的記憶體地址的起始位置中,並返回指向dest的指標。

與strcpy相比,strcpy只能複製字串,memcpy可以複製任何內容,memcpy需要指定長度,strcpy遇到'\0'結束。

2、memset

void *memset(void *s,int ch, size_t n);
將s中的前n個位元組用ch替換並返回s,在一段記憶體塊中填充某個給定值。 較大結構體或陣列清0最快的方法。

相關推薦

C++學習筆記字串

一、C風格字串1、字串常量 “Hello World”:C++中所有字串常量都由編譯器自動在末尾新增一個null字元。2、末尾添加了'\0'的字元陣列eg.char s1[] = "Hello"; char s2[] = {'H','e','l','l','o'}; char

C++學習筆記記憶體模型、名稱空間、物件和類

    1、標頭檔案中通常包含的內容:函式原型、使用#define和const定義的符號常量、結構宣告、類宣告、模板宣告、行內函數     2、同樣可以使用條件編譯     3、靜態持續變數:外部連結性、內部連結性、無連結性靜態持續變數:外部連結性、內部連結性、無連結性         外部連結性:在程式碼塊

Python學習筆記——字串操作

字串字面量 雙引號 >>> spam = "This is Tom' cat" >>> spam "This is Tom' cat" 轉義字元 >>> print('\',\",\t

C#學習筆記—–C#高階特性:列舉型別和迭代

C#學習筆記(三)—–try語句和異常 列舉型別 enumerator是隻讀的、只能在序列的值上向前移動的遊標。一個enumerator是一個實現了下列任一介面的物件: ①System.Collections.IEnumerator ②System.C

ES6學習筆記——字串模板和字串新增的操作

1.字串連結以前:現在: 用字串模板(``)輸出結果均為:這個人叫strive,年齡是18用字串模板的優點:可以隨意換行    `${變數名字}`2.關於字串的幾個操作1.str.indexoOf  ( 要找的東西)        返回索引位置(沒找到返回  -1)2.str

C++學習筆記--函式引數,陣列函式,指標和const,二維陣列函式,遞迴,函式指標

C++ Primer Plus學習筆記之三 每一塊寫了一個詳細闡釋的demo,具體使用方法以及注意事項在程式碼裡都有備註 第七章函式--C++的模組程式設計,總計分為以下幾塊-- 函式引數

C++學習筆記標準庫vector型別和bitset型別

1. vector物件的定義和初始化 標頭檔案 < vector> 幾種初始化vector物件的方式: vector<T> v1; //vector儲存型別為T的物件,預設建構函式v1為空 vector<T> v

C#學習筆記—–C#高階特性:dynamic

C#高階特性:動態繫結 動態繫結 動態繫結將型別繫結(型別解析、成員和操作過程)從編譯時推遲到了執行時。在編譯時,如果程式設計師知道某個特定函式、成員的存在而編譯器不知道,那麼這種操作是非常有用的,這種情況通常出現在操作動態語言和COM,如果不適用動態

C#學習筆記:邏輯關系運算符和if語句

同學 判斷 請問 登陸 tasks 不同 入學 根據 重要 條件語句 分支語句和循環語句是程序裏最重要的邏輯。 IF語句、分支語句、循環語句 using System; using System.Collections.Generic; using System

C#學習筆記—–C#高階特性:擴充套件方法

C#高階特性:擴充套件方法 擴充套件方法允許為一個類定義新的方法但是不用操作這個類。擴充套件方法就是一個靜態類的靜態方法,這個方法的第一個引數的型別就是要擴充套件的這個類的型別(加this): public static class StringHe

C#學習筆記—–C#高階特性中的委託與事件

C#高階特性中的委託與事件(中) 事件 委託本身又是一個更大的模式(pattern)的基本單位,這個模式稱為publish-subscribe(釋出——訂閱)。委託的使用及其對publish-subscribe模式的支援是本章的重點。本章描述的所有內容幾乎

C#學習筆記12——種方法操作XML

結點 記得 ext 應用程序 eval 資源 特性 pla cells 說明(2017-7-11 16:56:13): 原文地址: C#中常用的幾種讀取XML文件的方法 XML文件是一種常用的文件格式,例如WinForm裏面的app.config以及Web程序中的web.c

C#可擴展編程之MEF學習筆記:導出類的方法和屬性

學習 說了 如何 mod ati dem ont num imp 前面說完了導入和導出的幾種方法,如果大家細心的話會註意到前面我們導出的都是類,那麽方法和屬性能不能導出呢???答案是肯定的,下面就來說下MEF是如何導出方法和屬性的。   還是前面的代碼,第二篇中已經提供了下

MongoDB學習筆記--MongoDB的C#驅動的基本使用

官方C#驅動:https://github.com/mongodb/mongo-csharp-driver/releases 在使用C#驅動時,要在專案中新增”MongoDB.Bson.dll”和”MongoDB.Driver.dll”的引用。同時要在程式碼中

C#學習筆記005字串型別

一、概述        字串型別在程式設計中是使用最頻繁的資料型別,掌握好字串型別的特性和使用非常重要,特別是字串中一些常用的方法及演算法。C#中的字串型別的關鍵字是string。字串的表示方法是用英文的雙引號“括起來”,比如:"a",這個就是字串。 二、字串特性  

C++Primer》讀書筆記字串、向量、陣列

名稱空間using宣告 (1)本節學習最安全的方法使用using宣告 using namespace::name 注意:使用一個名字就要有其對應的uesing宣告,如:using std::cin; (2)標頭檔案不應包含using宣告 - 標

SQLite學習筆記-- 開啟和關閉資料庫C++實現

1.Sqlite庫的使用 相對來說Sqlite庫的使用還是比較簡單的。只需要包含標頭檔案和庫檔案,同時將動態連結庫放在執行程式目錄下。 //sqlite3標頭檔案 #include "sqlite3.h" //sqlite3庫檔案 #pragma com

JAVA學習筆記

byte repl efi ber 時間 clas 區分大小寫 增強for size @SuppressWarnings("resource")是用來壓制資源泄露警告的。比如使用io類,最後沒有關閉。Set集合特點:1)無序,不隨機2)元素唯一3)沒下標註意:Collect

C#學習筆記7——委托

() namespace test task cnblogs [] string 命名空間 program 說明(2017-5-29 22:22:50): 1. 語法:public delegate void mydel();這一句在類外面,命名空間裏面。 2. 專門新建一

thinkphp5.0學習筆記獲取信息,變量,綁定參數

名稱 自動識別 參數順序 query images 報錯 oca nds arc 1.構造函數: 控制器類必須繼承了\think\Controller類,才能使用: 方法_initialize 代碼: <?php namespace app\lian\control