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最快的方法。