zoukankan      html  css  js  c++  java
  • 12-C语言字符串

    目录:

    一、字符串

    二、字符串输入输出函数

    三、指针数组(字符串数组)

    回到顶部

    一、字符串

    1 一组字符数组,以数组的首地址开始,以ASC码的''结束。

    2 字符串与普通数组的区别:普通数组没有结束标识,而字符串是有的。

    3 字符串的定义方式:

    字面值:"hello"

    使用字符数组定义字符串:char str[10] = {''a,'b',''};

    使用字符指针:char* str = "hello";

    4 字符串创建方式的不同

    声明的变量数组是放在内存中的栈区。

    字面值创建的字符在内存代码区。如果创建的字符串,且值是相同的,只会创建一个内存区域,值是只读的。

    使用数组方式创建的字符串,放在内存中栈区,其值可以改变。

    字符指针,只是指向了内存的一个区域。

     1 #include <stdio.h>
     2 
     3 int main(int argc, const char * argv[])
     4 {
     5 
     6     // 字面值
     7     printf("Hello, World!
    ");
     8     // 字符数组
     9     char str[10] = {'h','e','l','l','o',''};
    10     str[1] = 'a';
    11     char str5[10] = {'h','e','l','l','o',''};
    12     // 字符指针
    13     char* str2 = "hello";//字面值字符串不可以改变其值
    14     char* str3 = str;
    15     char* str4 = "hello";
    16     // 输出
    17     printf("str:%s
    ",str);
    18     printf("str2:%s
    ",str2);
    19     printf("str3:%s
    ",str3);
    20     printf("str:%p
    ",str);
    21     printf("str2:%p
    ",str2);
    22     printf("str3:%p
    ",str3);
    23     printf("str4:%p
    ",str4);
    24     printf("str5:%p
    ",str5);
    25     return 0;
    26 }

    练习:键盘输入个人信息,姓名:年龄:性别:薪资:

     1 #include <stdio.h>
     2 //练习:键盘输入个人信息,姓名:年龄:性别:薪资:
     3 int main()
     4 {
     5     printf("输入个人信息:
    ");
     6     char name[20];
     7     char sex;
     8     int age;
     9     double salary;
    10     printf("姓名:");
    11     scanf("%s",name);
    12     printf("性别:");
    13     scanf("%*c");
    14     scanf("%c",&sex);
    15     printf("年龄:");
    16     scanf("%d",&age);
    17     printf("薪资:");
    18     scanf("%lf",&salary);
    19     printf("姓名%s
    ",name);
    20     printf("性别%c
    ",sex);
    21     printf("年龄%d
    ",age);
    22     printf("薪资%lf
    ",salary);
    23     return 0;
    24 }

    xcode快捷键:command +a 、 Ctrl+i全选格式化

    回到顶部

    二、字符串输入输出函数

    1输入

    scanf()接收用户从键盘上输入的数据。

    scanf(%*c)清空缓存区

    练习:输入三次性别,并输出。

    在输入字符串的时候不存在缓冲区问题,但存在安全性问题,(内存溢出)。

    解决:fgets()函数

    语法格式:fgets(参数1,参数2,参数3)

    参数1保存数据的首位置

    参数2保存的是长度(包括结束符)

    参数3获取数据的方式

    注:使用fgets方式输入数据的时候,会自动在数据的后面加上' ';计算数据的时候,原有数据内容加上'',' ';解决安全性问题,主要是参数2;

    假如字符串长度是3:

    abcde   ->  abcde

    2 输出

    printf()可以输出字符串,并且可以根据占位符的个数来决定输出字符串的个数。

    puts()可以输出一个字符串,而且是自动换行。

    printf()与puts()区别:

    相同点:都可以输出字符串

    不同点:printf()需要手动换行,可以多次输出字符串,puts()自动换行,只能输出一个字符串。

    3 const关键字,可以将变量变为只读,只可以在初始化的时候才可以改变变量的值,此变量就为常量,

    const int* p = &i;//指针指向的值变为只读

    int* const p = &i;//指针的值变为只读

     1 /*输入函数 缓冲区问题*/
     2 #include <stdio.h>
     3 
     4 int main(int argc, const char * argv[])
     5 {
     6     /*
     7      char ch1,ch2,ch3;
     8      printf("请输入第一个字符:
    ");
     9      scanf("%c",&ch1);
    10      scanf("%*c");//清除缓冲存
    11      printf("请输入第二个字符:
    ");
    12      scanf("%c",&ch2);
    13      scanf("%*c");
    14      printf("请输入第三个字符:
    ");
    15      scanf("%c",&ch3);
    16      
    17      printf("输出第一个字符:%c
    ",ch1);
    18      printf("输出第二个字符:%c
    ",ch2);
    19      printf("输出第三个字符:%c
    ",ch3);
    20      */
    21     
    22     char ch1[6],ch2[6];
    23     printf("请输入第一个字符串:
    ");
    24     fgets(ch1, 6, stdin);
    25     //printf("输出第一个字符串:%s %s
    ",ch1,ch1);
    26     puts(ch1);
    27     printf("test
    ");
    28     /*
    29     printf("请输入第二个字符串:
    ");
    30     fgets(ch2, 6, stdin);
    31     printf("输出第二个字符串:%s
    ",ch2);
    32      */
    33         return 0;
    34 }

    回到顶部

    三、指针数组(字符串数组)

    1 数组中的元素是指针,而指针又是字符串,所有也叫字符串数组。

    2 保存多个字符串内容

    3 定义指针数组:char* array[3]={"gy","zf","lb"};

    4 遍历

    for(int i = 0;i < 3;i++){

          printf("array[%d]:%s ",i,array[i]);

    }

     1 //指针数组 字符串数组
     2 #include <stdio.h>
     3 void test(){
     4     // 声明指针数组
     5     char* names[3] = {"guanyu","zhangfei","liubei"};
     6     //遍历
     7     for (int i = 0; i < 3; i++) {
     8         printf("names:%s
    ",names[i]);
     9     }
    10 }
    11 //输入3个人姓名,输出
    12 void test2(){
    13     char* names[3];
    14     char name[3][10];
    15     for (int i = 0; i < 3; i++) {
    16         printf("输入姓名:
    ");
    17         scanf("%s",name[i]);
    18         names[i] = name[i];
    19     }
    20     for (int i = 0; i < 3; i++) {
    21         printf("names:%s
    ",names[i]);
    22     }
    23 }
    24 int main(int argc, const char * argv[])
    25 {
    26 
    27     test2();
    28     return 0;
    29 }
  • 相关阅读:
    windows的80端口被占用时的处理方法
    Ansible自动化运维工具安装与使用实例
    Tomcat的测试网页换成自己项目首页
    LeetCode 219. Contains Duplicate II
    LeetCode Contest 177
    LeetCode 217. Contains Duplicate
    LeetCode 216. Combination Sum III(DFS)
    LeetCode 215. Kth Largest Element in an Array(排序)
    Contest 176 LeetCode 1354. Construct Target Array With Multiple Sums(优先队列,递推)
    Contest 176
  • 原文地址:https://www.cnblogs.com/yangmx/p/3474255.html
Copyright © 2011-2022 走看看