C语言学习|字符串(10.19)

基本概念

1.字符串:由字符组成的字符数组,且最后一个元素为’\0’
2.’\0‘占一个字节的内存,但它不计入字符串的实际长度,只计入数组的长度。
3.初始化
char str[6] = {‘H’,‘e’,‘l’,‘l’,‘o’,’\0’};
char str[] = {‘H’,‘e’,‘l’,‘l’,‘o’,’\0’};
char str[] = {“Hello”};
char str[] = “Hello”;
4.字符指针:指向字符型数据的指针变量。
5.字符串的地址:字符串常量本身就代表存放它常量的首地址,是一个地址常量(如: char * p = “Hello”; 与 char *p; p = “Hello”; 是等价的。由于"Hello"保存在只读常量存储区中,此时,不能对p所指向的存储单元进行写操作,即 *p = 'W’是错误的)。
6.但如果"Hello"保存在一个数组中,char str[10] = “Hello”; char *p = str;,则 *p = 'W’是正确的,表示将str中第一个字符修改为W。
7.对单个字符进行赋值操作可以使用赋值运算符,但字符串不行,只能用strcpy()。
8.字符数组的循环通常不使用计数控制,而使用条件控制,利用字符串结束标志’\0’判断是否遍历结束
9.为防止实参在被调函数中被修改,可在形参前面加const

字符串的输入输出

1.按c格式符,一个字符一个字符单独输出:

for (i = 0; str[i] != '\0'; i++)
{
	printf("%c",str[i]);
}

2.按s格式符,整体输出:

scanf("%s",**str**);           //注意:此处不用添加取地址符&
/*表示读入一个字符串,**直到遇到空白字符为止**,当遇到空白字符时,空白字符之后的字符留在了**输入缓冲区**中,下次遇到scanf()时自动被读取*/
printf("%s",str);
/*表示输出一个字符串,直到遇到'\0'为止*/

3.运用gets()函数:

gets(str);
/*以回车符'\n'作为字符串终止符,同时将'\n'从输入缓冲区读走,但不作为字符串的一部分,而scanf()不读走'\n',仍留在缓冲区中*/

4.运用puts()函数:

puts(str);
/*从括号中参数的地址开始,依次输出存储单元中的字符,当遇到'\0'时结束,并且自动输出一个换行符*/

5.运用fgets()函数:

fgets(str,sizeof(str),stdin);
/*限制输入字符串不超过数组大小*/

gets()和scanf()存在的问题

不能限制输入字符串的长度,容易引起缓冲区溢出;使用这两个函数时,要确保输入字符串的长度不超过字符串的大小。

字符串处理函数

前提:以下函数均包含在头文件<string.h>中

函数功能 函数 功能描述及说明
求字符串长度 strlen(str); 不包括’\0’
字符串复制 strcpy(str1,str2); 将str2复制到str1中,确保str1足够大
字符串比较 strcmp(str1,str2); 比较ASCII值,str1>str2时,返回值>0,以此类推
字符串连接 strcat(str1,str2); 将str2连接在str1后面,覆盖’\0’,str1应足够大
”n族“字符串复制 strncpy(str1,str2,n); 将str2至多前n个字符复制到str1中
”n族“字符串比较 strncmp(str1,str2,n); 至多比较n个字符
”n族“字符串连接 strncat(str1,str2,n); 至多添加n个字符

代码

字符串排序

#include <stdio.h>
#include <string.h>
#define N 150  //字符串个数
#define MAX_LEN 150  //字符串最大长度

void SortString (char str[][MAX_LEN],int n);

int main()
{
    int i,n;
    char name[N][MAX_LEN];
    printf("How many countries?");
    scanf("%d",&n);
    getchar();   //读走缓冲区的回车符
    printf("Input there names:\n");
    for (i = 0; i < n; i++)
        gets(name[i]);    //输入n个字符串
    SortString(name,n);
    printf("Sorted results:\n");
    for (i = 0; i < n; i++)
        puts(name[i]);    //输出排序后的n个字符串

    return 0;
}
/*交换法实现字符串按字典顺序排列*/
void SortString (char str[][MAX_LEN],int n)
{
    int i,j;
    char temp[MAX_LEN];
    for (i = 0; i < n-1; i++)
        for (j = i+1; j < n; j++)
            if (strcmp(str[i],str[j]) > 0)
            {
                strcpy(temp,str[i]);
                strcpy(str[i],str[j]);
                strcpy(str[j],temp);
            }
    return;
}

函数实现字符串复制

void MyStrcpy (char desStr[],char srcStr[])
{
    int i = 0;
    while (srcStr[i] != '\0')
    {
        dstStr[i] = srcStr[i];
        i++;
    }
    dstStr[i] = '\0';
}
void MyStrcpy (char *desStr,char *srcStr)
{
    while (*srcStr != '\0')
    {
        *dstStr = *srcStr;
        srcStr++;
        dstStr++;
    }
    *dstStr = '\0';
}

函数实现字符串连接

/*返回连接后字符串的首地址*/
char *MyStrcat (char *dstStr,char *srcStr)
{
    char *pStr = dstStr;
    /*将指针移到字符串dstStr的末尾*/
    while (*dstStr != '\0')
        dststr++;
    for (; *srcStr != '\0'; dstStr++,srcStr++)
        *dstStr = *srcStr;
    *dstStr = '\0';
    return pStr;    //返回连接后字符串的首地址
}

猜你喜欢

转载自blog.csdn.net/qq_42272723/article/details/83183432