- char* VS char[]
- char[]定义的能修改,char*却不行
- `char *__cdecl strtok(char *_String, const char *_Delimiter)`:字符串分割
- `strtok(NULL, delims)`
- strtok_s
- 字符串拼接
- atoi()
- memcpy VS strcpy \ strcpy_s \ strncpy \ strncpy_s
- `void *memcpy(void *s1, const void *s2, size_t n) `:内存拷贝
- `char *strcpy(char *s2, const char *s1);`:字符串复制
- `char *strncpy(char *s2, const char *s1, size_t n);`
int main(int argc, char *argv[])
{
char a[74] = "abcefghijk";
char *b = "abcefghijk";
a[8]= 'd'; // correct
b[8] = 'd'; // error
}
mov esi,offset string "abcefghijk"... (0977588h)
lea edi,[a]
rep movs dword ptr es:[edi],dword ptr [esi]
-
char[]
:将字符串的偏移地址,赋值到esi寄存器。把a地址给了[edi]
,然后通过rep movs
循环执行,把[esi]
处的字符,赋值给[edi]
,也就是把字符串复制一份到a (实际 *** 作了一个新的字符串,不是数据段中的那个字符串)。 -
char*
:将字符串的偏移地址,赋值到b变量所在地址(如果两个或者多个变量都用了同一个字符串。那么对b的修改,会改变字符串,所有引用这个字符串的变量就都变了)。
https://www.jb51.net/article/222731.htm
char *__cdecl strtok(char *_String, const char *_Delimiter)
:字符串分割
warning:会修改源字符串。
- 在函数strtok()内部使用了一个静态变量SAVE_PTR指针,用以记录分割一次之后_String中下一个字符串的位置。
- 如果_String为空,则函数内部保存的SAVE_PTR指针将作为起始位置。
=》
- strtok()函数是线程不安全的(因为其函数内部使用到了静态存储区)
- 函数strtok()实际上修改了s指向的字符串。s最终指向第一个子串。
strtok(NULL, delims)
首次调用时,s必须指向要分解的字符串,随后调用要把s设成NULL。
strtok在s中查找包含delim的字符并用NULL(’\0’)来替换,直到找遍整个字符串。
返回指向下一个标记串。当没有标记串时则返回空字符NULL。
int main()
{
char *p;
char str[100]="This is a test ,and you can use it";
p = strtok(str," "); // 此时p指向字符串:"This"(第一个分割子串)。即每次找到一个分隔符后,一个NULL就被放到分隔符处,此时NULL指针指向后面的字符串:"is a test ,and you can use it"。
// 继续获取其他的子字符串
while(p != NULL)
{
p = strtok(NULL, ","); // NULL 即为上面返回的指针,即字符串: "is a test ,and you can use it"。
}
return 0;
}
C 语言字符串分割函数 p = strtok(NULL, " ");
C/C++——字符串分割(strtok, strtok_s)
strtok_schar *__cdecl strtok_s(char *_String, const char *_Delimiter, char **_Context)
strtok_s()函数增加了一个参数_Context,这个参数就是相当于strtok()函数中内部定义的静态SAVE_PTR指针,用来传递对字符串_String的处理进行到了哪里。
相较于strtok()函数,strtok_s函数需要用户传入一个指针,用于函数内部判断从哪里开始处理字符串(自动更新)。
字符串拼接// 方法1:
char *name1="123";
char *name2="456";
char test[10]; // char*不可修改,所以需要char[]承接
strcpy(test,name1);
strcat(test,name2);
// 方法2:
string name1,name2,name3;
name1="123";
name2="456";
nam3=name1+name2;
char test2[30];
strcpy(test,name3.c_str());
// 方法3:
char *name1="123";
char *name2="456";
char *name3=new char [30]; // 必须分配空间
strcpy(name3,name1);
strcpy(name3,name2);
char类型拼接(c)
atoi()把参数 str 所指向的字符串转换为一个整数(类型为 int 型)。
memcpy VS strcpy \ strcpy_s \ strncpy \ strncpy_svoid *memcpy(void *s1, const void *s2, size_t n)
:内存拷贝
要点记录:
- 一定要拷贝n个字符。
- 重叠问题?
- 对于包含“
- memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。 ”的字符串只能用memcpy。
char *strcpy(char *s2, const char *s1);
strncpy()
” 作为结束判断。要点记录:
- strcpy只能复制字符串。
- 如果 s2 的空间不够,则会引起 buffer overflow。 =》 建议使用
char *strncpy(char *s2, const char *s1, size_t n);
。 - s2指向的内存一定会被写n个字符。
- 当n>strlen(s1)时,给s2不够数的空间里填充“\0”;当n<=strlen(s1)时,s2是没有结束符“
”。
strcpy、strncpy与memcpy的区别与使用方法欢迎分享,转载请注明来源:内存溢出
评论列表(0条)