IOS开发学习基础--------C语言(五)

                                                第五章     数组与字符串


           本章内容:1.一维数组的声明、初始化与使用   2.字符串    3.字符串库函数    4.二维数组的声明、初始化和使用


           1.1  一维数组的声明、初始化和使用

           声明:int scores[5]; 初始化:int scores[5]={1,2,3,4,5};或者 int scores[ ]={1,2,3,4,5};只有这两种。

           使用:int scores[5]; scores[0] = 10;scores[1] = 10;scores[5] = 10;注意:这么写不正确,C语言中没有下表越界的检查机制,运行时下表越界往往会得到一些意想不到的结果。

           典型算法:冒泡排序(起泡排序)可以很好的体现一维数组的初始化和使用。

//冒泡排序,从小到大

int array[] = {21,34,32,12,34,76,39};
int n = sizeof(a)/sizeof(int);
printf("冒泡排序前的数据为:\n");
for(int i=0;i<n;i++)
{
        printf("%d\t",a[i]);
}

//冒泡排序
for(int i=0;i<n;i++)
{
     for(int j=0;j<n-i;j++)
     {
           if(array[j]>array[j+1])
           {
                 int temp = array[j];
                 array[j] = array[j+1];
                 array[j+1] = temp;
           }
     }

//冒泡排序后的数据
printf("冒泡排序前的数据为:\n");
for(int i=0;i<n;i++)
{
        printf("%d\t",a[i]);
}
}

          1.2  数组作为函数参数

                  

void changArrays(int array[10]){
    n=10;
    for(int i=0;i<n;i++)
    {
         for(int j=0;j<n-i;j++)
         {
               if(array[j]>array[j+1])
               {
                    int temp = array[j];
                    array[j] = array[j+1];
                    array[j+1] = temp;
                 }
          }
}
       

                C语言中将数组作为参数进行传递时,无论数据量大小,不将数组进行复制,而是直接将数组本身传入函数内部,函数内如果改变了传入的数组的值,那么函数外的那个数组的原始值也会发生改变。


           1.3 字符串

                C语言中规定使用双引号引起来的字符序列为字符串。在存储字符串时结尾会加上一个NULL符号常量(' \0 '),字符串通常会以这个符号常量作为结束标志。

               初始化: char str[7]  = " hello! "; 或者   char str [ ] = " hello! "  或者  char str[7] = { ' h ' ,' e ',' l ',' l ',' o ',' \0 '}; 或者  char str[ ] = { ' h ' ,' e ',' l ',' l ',' o ',' \0 '}; 

  
    char str[9] = "hello C!";
    int i=0;
    while(str[i]!=0)
    {
         printf("%c\n",str[i]);
         i++;  
    }
             字符串的三种输入输出方式:

1.getchar()函数和putchar()函数     

//getchar()和putchar()
  char str[100],c;
  int i=0;
  while((c=getchar()) != '\0')
  {
        str[i] = c;
        i++;
   }
    str[i] = '\0';
   
    i=0
    while(str[i] != '\0')
    {
         putchar(str[i]);
         i++;
     }


2.scanf()和printf()函数
//scanf()和printf()
//PS:我们在输入字符串时,如果字符串中包含空格,且后面只有一个变量接受数据,那么输入时第一个空格之后的内容将不接受

  char str[100];
   printf("请输入一串字符串\n");
   scanf("%s",str);
   printf("输入的字符串是:\n%s",str);

3.gets()和puts()函数

 //gets()输入时,假如字符串中含有空格,可以输入


    char str[100];
    printf("请输入一串字符串\n");
    gets(str);
    printf("输入的字符为:\n");
    puts(str);

          1.4  字符函数   (包含在string.h中

            <a> 字符串库函数,首先要将string.h文件包含进去。复制:strcpy(str1,str2)    剪切:strcat(str1,str2)     计算字符串长度:strlen(str)       字符串比较:strcmp(str1,str2)

//字符串函数的使用
void charToUse()
{
    char str1[100]="my name";
    char str2[100]="haogaoming";
    char str3[100]="my name is haogaoming";
    
    printf("把str2复制到str1中:\n");
    strcpy(str1,str2);
    puts(str1);
    puts(str2);
    
    printf("把str2剪切到str1中:\n");
    strcat(str1,str2);
    puts(str1);
    puts(str2);
    
    printf("str1的长度:%ld\n",strlen(str1));
    
    printf("比较str1与str3的大小:\n");
    int i=strcmp(str1, str3);
    if (i<0) {
        printf("str3>str1");
    }else if(i==0){
        printf("str3=str1");
    }else{
        printf("str1>str3");
    }

}


            <b> 字符函数:(包含在ctype.h中)

//输入一段字符串,大写改成小写,小写改成大写
void changCharBigAndSmall()
{
    char str[50];
    int i=0;
    gets(str);
    
    while (str[i]!='\0') {
        if (isupper(str[i])) {
            str[i] = tolower(str[i]);
        }else if(islower(str[i])){
            str[i] = toupper(str[i]);
        }
        
        i++;
    }
    puts(str);
    
    /*
     *第二种
    char str[50],c;
    int i=0;
    while ((c=getchar())!='\n') {
        str[i] = c;
        i++;
    }
    str[i] = '\0';
    i=0;
    while (str[i]!='\0') {
        if (isupper(str[i])) {
            str[i] = tolower(str[i]);
        }else if(islower(str[i])){
            str[i] = toupper(str[i]);
        }
        
        i++;
    }
    i=0;
    while (str[i]!='\0') {
        putchar(str[i]);
        i++;
    }
     
    */ 
}

            <c> 转换函数   (包含在stdlib.h中)

                   将字符串转换成整型:atoi(str)      将输入的整型数字转换成字符串:itoa(x)     将字符串转换成浮点型数字:atof(str)      

            <d> 格式化字符串

                    spintf()和sscanf()。

//sprintf的使用
void howUseSsprintf()
{
    char str1[20]="Hello word";
    char str2[21];
    sprintf(str2,"%.5s",str1);
    puts(str2);
}

// PS:str2的值是Hello

//sscanf的使用
void howUseSscanf()
{
    int year,month,day;
    char str[]="2013/11/21";
    sscanf(str,"%d/%d/%d",&year,&month,&day);
    printf("%d  %d  %d",year,month,day);
}

//PS:year=2013,month=11,day=21

        现在给出三个例子,说明字符串的声明、定义和使用:

        第一个例子:在hello Word 中加入字符,重新输出

//Hello word中间假如一个字符 sscanf的使用
void helloAddChar()
{
    /*
     * 简单的做法
     char a[20],b[11];
     char str[] = "hello word";
     sscanf(str,"%s%s",a,b);
     puts(a);
     puts(b);
     strcat(a, " a ");
     strcat(a, b);
     puts(a);
     */
    char str[20]="hello word";
    char str1[11],str2[11];
    char c[5] = " a";
    int i=0,j=5;
    
    while (i<5) {
        str1[i] = str[i];
        i++;
    }
    
    i=0;
    while (j<10) {
        str2[i] = str[j];
        i++;
        j++;
    }
    
    for (int i=0; i<20; i++) {
        str[i]='\0';
    }
    
    strcat(str, str1);
    strcat(str, c);
    strcat(str, str2);
    
    puts(str);
}

           第二个例子:单词计数

//计算单词的个数
int countWordNum(char str[])
{
    gets(str);
    int i=0,isWord=0,ci=0;
    
    while (str[i]!='\0') {
        if (str[i]==' ') {
            isWord = 0;
        }else if (isWord==0){
            isWord = 1;
            ci ++;
        }
        i++;
    }
    return ci;
}
 

         第三个例子:从给定的字符串中删除一部分后重新输出

//从给定的字符串中删除一部分
void delChar(char str[],int n,int y)
{
    char str1[20];
    for (int i=n; i<n+y; i++) {
       str1[i-n]=str[i];
    }
    
    int i=0,j=0;
    while (str[i]!='\0') {
        if (str[i] == str1[j]) {
            str[i] = str[n+y+i-n];
            j++;
        }
        if (n+y+i-n>=strlen(str)) {
            break;
        }
        i++;
    }
}


          1.5  二维数组的声明、定义和使用

               定义: int array[10 ][10 ];

              初始化:二维数组初始化时可以省略行数,但是列数不能省略。int array[2][3]={{1,2,3},{4,5,6}};或者    int array[2][3] = {1,2,3,4,5,6};   或者    int array[ ][3] = {1,2,3,4,5,6};

              使用:

#define ROWS 2
#define COLS 4


//二维数组求平均值
double twoAvage(int arry[ROWS][COLS])
{
    int sum=0;
    for (int i=0; i<ROWS; i++) {
        for (int j=0; j<COLS; j++) {
            sum +=arry[i][j];
        }
    }
    
    return sum/(float)(ROWS * COLS);
}


      PS:写在最后:二位数组与字符串是有关系的,可以将二维数组看成多个字符串来使用,这样我们可以解决一些复杂的字符串问题。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值