C语言编程:字符数组

一、查找算法---二分法(补充):大幅度降低查找效率

1.基本原理
        将搜索范围每次缩小一半,从而快速定位目标值。
2.搜索过程:
1)初始化:设置两个指针 begin 和 end,分别指向数组的起始位置(a[0])和结束位置(a[len-1])。
2)循环比较:
计算中间位置 mid = (begin + end) / 2。
比较中间元素 a[mid] 与目标值 n 的大小:
若 a[mid] > n:说明目标值在左半部分,更新 end = mid - 1,缩小搜索范围到左半区。
若 a[mid] < n:说明目标值在右半部分,更新 begin = mid + 1,缩小搜索范围到右半区。
若 a[mid] == n:直接找到目标值,搜索结束。
3)终止条件:
当 begin > end 时,表示搜索范围为空,目标值不存在;否则继续循环直至找到目标值。
 

#include
int main(void)
{
     int a[]={1,2,3,4,5,6,7,8,9,0};
     int len = sizeof(a) / sizeof(a[0]);
     int i,j;
 
     for(j = len - 1; j > 0 ; --j)
     {
         for(i = 0;i < len - 1; ++i)
         {
             if(a[i] > a[i + 1] )
             {
             
                 int t;
                 t = a[i];
                 a[i] = a[i + 1];
                 a[i + 1] = t;
             }
         }
      }     
     int n;
     int begin = 0;
     int end = len - 1;
     scanf("%d",&n);
 
     while(begin <= end)
     {
         int mid = (begin + end) / 2;
         if(a[mid] > n)
         {
             end = mid - 1;
         }
         else if(a[mid] < n)
         {
             begin = mid + 1;
         }
         else
         {
             break;
         }
     }
     if(begin <= end)                                                                                                       
     {
         printf("found\n");
     }
     else
     {
         printf("not found\n");
     } 
     return 0; 
 }


二、字符数组

1.定义

        用来存放字符数据的数组是字符数组。字符数组中的一个元素存放一个字符。

2.表达形式

        char 数组名 [ 字符总容量]

3.字符数组的初始化

        char c[ 10] = {'a','b','c','d','e','f','g','h','i','\0'};即 char c [10]="abcdefghi"

        计算字符数组的长度:sizeof(c)

        输出字符数组长度: printf("%lu\n",sizeof(c));

说明:

1>.如果初始化的字符个数小于字符长度,则未被定义的元素自动为空字符'\0'。

2>.字符数组内的总长度要比所表示的有效字符的个数加一,因为其中包含了一个空字符'\0',其表示字符串的结束,会被隐藏在字符串的末尾。

4.各类程序

1>.打印字符串

 #include
 int main(void)
 {
     char s[100] = "Hello ";
     int i = 0;
 
     while(s[i] != '\0')
     {
         putchar(s[i]);
         ++i;
     }     
     puts(s);
     putchar('\n');
     return 0;
 }

关键点说明:

1字符串结束符:C 语言字符串以'\0'结尾,循环通过检测该字符来确定字符串的结束位置

2).putchar()与puts()的区别:
putchar():每次只能输出一个字符,不会自动添加换行。
puts():一次性输出整个字符串,并自动添加换行。

3).puts()已经添加了一个换行,而后续的putchar('\n')会再添加一个换行,导致最终输出有两个连续的空行。

        可简化为:

#include
int main(void)
{
     char s[100] = "Hello ";
     int i = 0;
 
     puts(s);
     putchar('\n');
     return 0;
}

以上两种均可将字符数组中的字符串打印出来。

2>.输出字符串

1)scanf("%s",s):scanf在键盘输入时,会将空格,Tab,换行符均视为输入结束。

2)gets(s):只要输入回车键就会停止输入,由于gets() 不限制输入长度,可能导致缓冲区溢出。

3)fgets(s,sizeof(s),stdin):会读取换行符 \n 并存储在字符串中,若越界访问时,输出结果则会为正确字符长度的任意字符。

3>.计算字符长度

1)sizeof(s):计算的是该字符数组的总容量

2)strlen(s):计算的是该字符串的有效字符长度

程序如下:

#include
int main(void)
{
    char s[10] = "Hello";
    int i = 0;
    int counter = 0;
    while(s[i] != '\0')
    {
        counter += 1;
        ++i;
    }
    printf("%d\n",counter);
    return 0;
}

其可以简化为:

#include
int main(void)
{
    char s[10] = "Hello";
    int i = 0;
    
    printf("%lu\n",strlen(s));
    printf("%d\n",sizeof(s));
    return 0;
}

4>.拷贝字符串

        strcpy(目的字符数组,原字符数组);

#include
int main(void)
{
    char s1[100] = "Hello";
    char s2[100];
    int i = 0;
    while(s1[i] != '\0')//strcpy(s2,s1);
    {
        s2[i] = s1[i];
        ++i;
    }
    s2[i] = '\0';

    puts(s2);
    return 0;
}

简化为:

#include
int main(void)
{
    char s1[100] = "Hello";
    char s2[100];
    int i = 0;
    
    strcpy(s2,s1);
    puts(s2);
    return 0;
}

5>.两数组拼接

        strcat(目的字符组,原字符组);

#include
int main(void)
{
    char s1[100] = "Hello ";
    char s2[100] = "World!";
    int i = 0;
    int j = 0;

    while(s1[i] != '\0')
    {
        ++i;
    }
       
     while(s2[j] != '\0')
    {
        s1[i] = s2[j];
        ++i;
        ++j;           
    }                                                                                                                      
    s1[i] = '\0';
 
    puts(s1);
    return 0;
}

简化为:

        strcat(s1,s2);

        puts(s2);

6>.字符串的比较

        strcmp(s1,s2);//其结果为int型

        printf("%d\n",strcmp(s1,s2));//其输出结果>0,则s1 >s2;若<0,则s1

        

#include
#include
int main(void)
{
    char s1[100] = "Hello";                                                                                                
    char s2[100] = "World!";
    char s3[100] = "China";
    char max[100];

    if(strcmp(s1,s2) > 0)
    {
        strcpy(max,s1);
    }
    else
    {
        strcpy(max,s2);
    }
    if(strcmp(max,s3) < 0)
    {
        strcpy(max,s3);
    }
    puts(max);

    return 0;
}

其strcmp 的原理程序为:

#include
#include
int main(void)
{
    char s1[100]="Hello";
    char s2[100]="Wchina";

    int i = 0;

    while(s1[i] == s2[i] && s1[i] != '\0' && s2[i] != '\0')
    {
        ++i;
    }
    printf("%d\n",s1[i] - s2[i]);
    return 0;
}

其原理是,先比较两个数组的第一个字符,如果不相同,则ASCII码值大的则其数组大,反之则小;若第一个字符相同,则依次顺位按照上述方式进行比较,如若一直相同,则该程序碰见'\0'结束比较。

<注意>:s1 不能直接和s2直接比较,其s1>s2表示的是s1和s2的地址的大小,而不是其字符串的大小。

你可能感兴趣的:(算法,数据结构)