黑马程序员技术交流社区

标题: IOS基础第十二天(上)字数限制,分开发,版主莫警告 [打印本页]

作者: dushoupeng    时间: 2015-7-10 09:33
标题: IOS基础第十二天(上)字数限制,分开发,版主莫警告
1、fgets()
     该函数一个文件操作相关的函数

     暂时使用这个函数可以从键盘商接收一个字符串,保存到数组中

   原来接收字符串保存到数组中的方法
   
      char str[50];

     1) scanf("%s",str);  //缺点:不能接收空格

     2) gets(str);        //优点:可以接收空格
                           //会有一个警告,不安全的
                           //不安全:比如数组长度是50,如果我们输入的
                           //的长度正好是50个,此时把50个字符全部存到
                           //数组中,存在问题 因为没有空间存放字符串结束符
  
    fgets()是一个安全的字符串接收的函数

      char ch[5];  //如果使用fgets此时数组中最多存放4个可见字符
                   //会自动的把数组的最后一个元素存放\0
    fgets()使用格式:
          fgets(数组名,数组长度,stdin);//std 标准 in 输入
    fputs();也是一个文件操作相关的函数
    格式:
       fputs(数组名,stdout);


#include <stdio.h>
#include <string.h>

int main(int argc, const char * argv[]) {
   
    char ch[5];
    //fgets从输入缓冲区读取一个字符串保存到字符数组中
    //当输入的字符串的长度大于数组的长度,此时fgets会自动的
       //把数组的最后一个元素变成\0
    //当输入的字符串的长度小于数组长度的时候,fgets还会接收回车
    fgets(ch, sizeof(ch), stdin);
    //去掉多余的\n
    if(ch[strlen(ch)-1]=='\n') ch[strlen(ch)-1]='\0';

    //\n  它的ascii码值10
    for (int i=0; i<5; i++) {
        printf("%d\t",ch[i]);
    }
   
    //fputs是不会自动换行
    //fputs也不能进行格式化的输出
    //puts 可以自动换行
    fputs(ch, stdout);
    //printf("--->%s\n",ch);

   
   
    return 0;
}
2.fgets(),fputs()优缺点:帮我们自动截取输入的字符串,使得我们队字符串的存取是安全的。
3.const:
1)什么是const:是一个类型修饰符,可以让变量的值不能改变。
2)作用:(1)定义常量
          (2)便于进行类型检查,使编译器对处理内容有更多了解,消除了一些隐患。
          (3)可以避免意义模糊的数字出现,同样可以很方便的进行参数的调整和修改。同宏定义一样,可以做到不变则以,一变都变
          (4)可以保护被修饰的东西,防止意外的修改,增强程序的健壮性。
          (5)可以节省空间
           (6)提高效率
  3)如何使用const
    const使用的地方


    1)修饰变量

       int a = 10;

       printf("%d\n",a);  //10

       a = 200;

       printf("%d\n",a);  //200

    2)修饰指针变量

    3)修饰数组

#include <stdio.h>
/**
*  const修饰变量,使得变量变成常量
*/
void test1(){

    //使用const修饰变量a
    const int a = 10;
    printf("%d\n",a);  //10
   
    //a = 200;//read-only
    printf("%d\n",a);  //200

}
/**
*  用指针强制修改const常量
*/
void test2(){


    //使用const修饰变量a
    const int a = 10;
    printf("%d\n",a);  //10
   
   
    int *p = &a;  //
    *p = 100;  //强制修饰常量
   
    printf("%d,%d\n",a,*p);  //

}

int main(int argc, const char * argv[]) {
   
    int a = 10;
    int b = 20;
   
    //定义个指针变量,p指向a
    //此处的const的作用是指针变量p的指向可以改变,但是指向的变量的值
    //不能改变的
   
    //1、const修饰的指针变量指向可变,指向的变量的值不可变
    const int *p = &a; //给p初始化
               p = &b;  //重新修改了p的指向
    //*p = 1000;
   
    int const *p1 = &a;
               p1 = p;  //p1的指向也是可以改变
//    *p1 = 100;  p1指向的变量的值是不能改变的
   
    //2、const修饰的指针变量,指针变量指向的变量值可以变,指向不能变
   
    int * const p2 = &a;
    *p2 = 2000; //值可以改变
    //p2  = &b;  //p2的指向不能变
   
    //3、const修饰的指针变量的指向和值,都不能改变
    const int * const p3 = &a;
//    p3  = &b;   //指向不能变
//    *p3 = 100;  //指向的变量的值也不能变
   
   
    /*
     
     记忆技巧:
     
        看 const 和 * 的位置
     
        如果 const 在 * 的左侧  表示指针变量指向的变量的值不能变,但是指向可以改变
     
        如果 const 在 * 的右侧  表示指针变量指向的变量的值可以改变,但是指向不可以改变
     
        如果 const 出现在 *的两侧,表示指针变量的指向和值都不能改变
     */
    printf("a = %d\n",a);
    return 0;
}
4.内存分配方式:有三种
(1)从静态存储区域分配:在定义的时候已经分配好
(2)在栈上创建:在执行函数时,函数内局部变量的存储单元都可以在栈上创建
(3)从堆上分配,亦称动态内存分配:程序在运行的时候分配。Malloc或new
5.内存的分区:


BOSS段:通常是指用来存放程序中未初始化的全局变量和静态变量
数据段:用来存放程序中已初始化的全局变量和静态变量;字符串常量等
代码段:存放程序执行代码的一块内存区域
堆:存放被动态分配的内存段
栈:存放用户临时创建的局部变量





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2