C 语言编程 — 高级数据类型 — 字符串
【摘要】 目录
文章目录
目录前文列表字符串字符串拷贝字符串比较strcmpstrncmp
前文列表
《程序编译流程与 GCC 编译器》 《C 语言编程 — 基本语法》 《C 语言编程 — 基本数据类型》 《C 语言编程 — 变量与常量》 《C 语言编程 — 运算符》 《C 语言编程 — 逻辑控制语句》 《C 语言编程 — 函数》 《C 语言编程 — 高级数...
目录
前文列表
《程序编译流程与 GCC 编译器》
《C 语言编程 — 基本语法》
《C 语言编程 — 基本数据类型》
《C 语言编程 — 变量与常量》
《C 语言编程 — 运算符》
《C 语言编程 — 逻辑控制语句》
《C 语言编程 — 函数》
《C 语言编程 — 高级数据类型 — 指针》
字符串
在 C 语言中,字符串由 char *
类型表示。它是由一串字符组成的,并以一个空终结字符结尾。所以,字符串实际上是使用 null 字符 ‘\0’ 终止的一维字符数组。下面的声明和初始化创建了一个 “Hello” 字符数组(字符串)。由于在数组的末尾存储了空字符,所以字符数组的大小比单词 “Hello” 的字符数多一个。
char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
字符串还可以字面量来表示,将要表示的字符串包裹在 " "
中就可以了。也就是说,并不需要把 null 字符显式的放在字符串常量的末尾。C 编译器会在初始化数组时,自动把 ‘\0’ 放在字符串的末尾。
char greeting[] = "Hello";
C 中内置的字符串操作函数:
#include <stdio.h>
#include <string.h>
int main ()
{ char str1[12] = "Hello"; char str2[12] = "World"; char str3[12]; int len ; /* 复制 str1 到 str3 */ strcpy(str3, str1); printf("strcpy( str3, str1) : %s\n", str3 ); /* 连接 str1 和 str2 */ strcat( str1, str2); printf("strcat( str1, str2): %s\n", str1 ); /* 连接后,str1 的总长度 */ len = strlen(str1); printf("strlen(str1) : %d\n", len ); return 0;
}
运行:
strcpy( str3, str1) : Hello
strcat( str1, str2): HelloWorld
strlen(str1) : 10
字符串拷贝
char * strcpy( char * dst, const char * src );
strcpy() 是一个标准库函数,把从 src 地址开始且含有 ’\0’ 结束符的字符串复制到以 dest 开始的地址空间,返回值的类型为 char*。
NOTE:当我们在程序中使用 char *str
来存储一个字符串时,实际上并不安全,而是应该使用一个真实的、定长的数组来进行存储。
static char str2[20];
...
char *str1 = "123"
strcpy(str2, str1)
字符串比较
C 标准库中的字符串比较有两个标准函数:strcmp 和 strncmp。
- strcmp
int strcmp (const char* src, const char* dst)
- strncmp
int strncmp(const char* src, const char* dst, size_t n)
从两者的函数原型可以看出,strncmp 多出来了一个 “比较长度” 的形参,这也导致了在某些场景中使用 strncmp 会比 strcmp 更安全的结果。
strcmp
- 若 str1 == str2,则返回零;
- 若 str1 > str2,则返回正数;
- 若 str1< str2,则返回负数。
两个字符串自左向右逐个字符相比(按 ASCII 值大小相比较),直到出现不同的字符或遇 “\0” 为止,例如:
strcmp("abcd", "abcd")
的返回值是 0;strcmp("abcd", "dcba")
的返回值是 -1;strcmp("dcba", "abcd")
的返回值是 1;
除了比较两个字符串之外,还可以用于比较数组和字符串,因为字符串本质就是一个数组。
strncmp
strncmp 可以指定比较 size_t n 个字符。也就是说,如果字符串 s1 与 s2 的前 n 个字符相同,则函数返回值为 0。反正,则依次比较 s1 和 s2 的前 n 位,若第 i(i < n)个字符为首次的不同位,则返回:s1[i] - s2[i]
。
- str1 小于 str2,返回值就 <0;
- str1 大于 str2,返回值就 >0;
- str1 等于 str2,返回值就 =0;
例如:str1=“ABCDHG”,str2=“ABCDEF”。
strncmp(str1, str2, 4)
返回值是 0;strncmp(str1, str2, 5)
返回值是 1;
可见,当我们比较两个长度不一致的字符串时,我们最好可以指定比较的 size_t n,确保 “有效字符” 的内容是一致的,而不会因为 “非预期的填充内容” 导致比较失败。
案例:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#pragma warning(disable:6031)
int main(int argc, char* argv[]) {
char fileName[256]; printf("请您输入一个需要创建的文件:\n");
scanf("%s",fileName);
getchar(); // 换行
FILE * fp = fopen(fileName, "w");
if (fp == NULL){
return -1;
} // scanf("%[^\n]", buf); 可以接受 空格
// fgets()
printf("请您往文件中的存入数据:\n");
char buf[1024];
memset(buf, 0, 1024);
while (1) {
/* scanf("%[^\n]", buf); */
// 输入多行不能再用 scanf 因为换行 scanf 就没用了
fgets(buf, 1024, stdin);
if (strncmp("Exit", buf,4)==0) { // 不能用 strcmp 因为 fgets 会带 \0 所以始终无法相等 ,用 strncmp 只比较字符部分,就可以达到效果。 break;
}
int i = 0;
while (buf[i] != '\0') { fputc(buf[i++], fp);
}
}
fclose(fp);
system("pause");
return EXIT_SUCCESS;
}
文章来源: is-cloud.blog.csdn.net,作者:范桂飓,版权归原作者所有,如需转载,请联系作者。
原文链接:is-cloud.blog.csdn.net/article/details/105354170
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
作者其他文章
评论(0)