C语言学习(4)
一、goto和标签
1. 作用: 帮助我们实现代码的跳转
标签的定义:
名字:
goto语句和标签配合使用
#include<stdio.h> int main() { int i; //定义一个标签 label: printf("程序开始运行了!\n"); for(i=0; i<5; i++) printf("hello gec!\n"); printf("程序准备退出了!\n"); //本来程序即将退出,我强行跳转到起始位置再来执行 //goto label; //往前面跳转 goto label2; //往后跳转 printf("中间还有代码111!\n"); printf("中间还有代码222!\n"); printf("中间还有代码333!\n"); printf("中间还有代码444!\n"); label2: printf("我成功跳过了中间部分的代码!\n"); return 0; }
二、C语言中的数组
作用:
存放多个相同类型的数据
定义数组:
类型名字 数组名[数组的大小]
例如: int a[10]; // 定义了数组名叫a,最多允许存放10个int类型的数据
float b[7]; //定义float类型数组,最多存放7个小数
char c[8]; //定义char类型数组,最多存放8个字符,开发中使用频率最高,保存字符串 "hello"(字符用单引号,字符串用双引号)
数组的大小:
sizeof求数组的大小 sizeof(a) sizeof(b)
数组的初始化和赋值:
以char类型数组为例:
char c[10]="hello"; //定义数组立马初始化
char c[10]; //定义数组,没有初始化
c="hello"; //典型错误,char类型数组赋值不能直接用=(赋值符号)
strcpy(c,"hello");
char c[10]={'h','e','l'}; //定义数组立马初始化,一个个字符依次初始化
#include <stdio.h> int main() { int i; //定义char类型的数组 //定义数组立马初始化 char a[10]="hello"; //定义char类型数组,同时将hello字符串保存到该数组中 //打印 printf("%s\n",a); //由于数组是连续存储的,还可以一个个字符打印 for(i=0; i<10; i++) printf("%c\n",a[i]); }
数组的下标:
a[0] ......a[n] //数组下标从0开始
数组部分初始化:
数组部分初始化,那么没有初始化的,系统默认全部都填充0
char类型数组求字符串实际长度
strlen(); 比如: strlen(buf); //求出buf中存放的字符串的实际长度
strlen和sizeof区别
sizeof可以求C语言中所有合法类型变量的大小
strlen只能用于求字符串的实际长度,其他类型的变量不能用strlen
#include <stdio.h> #include <string.h> int main() { int i; char a[10]; //(常规写法) //a="hello"; 错误//定义数组的没有赋初始化,char类型数组只能使用 strcpy(a,"hello"); //把字符串hello拷贝到数组a中 printf("a is:%s\n",a); //第三种(常规写法) char b[10]={'h','e','l'}; //b[0]--b[2] printf("b is %s\n",b); //第四种(非常规写法) char c[10]={'y',[3 ... 5]='h','p'}; printf("c is %s\n",c); for(i=0; i<10; i++) printf("c[%d] is:%c 对应的ASCII码值是:%d\n",i,c[i],c[i]); //第五种(常规写法) char d[10]; d[0]='w'; d[1]='o'; printf("d is:%s\n",d); //第六种(非常规写法) char e[10]; 0[e]='g'; //常规写法 e[0] 1[e]='e'; 2[e]='c'; printf("e is:%s\n",e); }
字符串的结束标记:
C语言规定,字符串必须用双引号括起来,并且字符串有结束标记'\0',用来标记字符串的结尾
我们在使用char类型数组的时候,需要多定义一个字节的空间留给\0
char a[5]="hello"; //不建议你这么写,\0没有位置
char a[6]="hello"; //给\0留了一个空间
int b[2]={18,17};
int main() { int i; char other[10]="china"; //for(i=0; i<strlen(other); i++) //写法一 for(i=0; other[i]!='\0'; i++) //写法二 { } char buf[50]="hello\0world"; printf("%s",buf); for(i=0; i<50; i++) printf("数组中字符是:%c 对应的ASCII码值是:%d\n",buf[i],buf[i]); }
数组越界:
任何一个数组a[n],它都有自己的范围 a[0]-----a[[n-1]
越界可能会产生段错误(你超出了系统分配给你的内存区域)
#include <stdio.h> int main() { int i; int a[5]={18,15,89,7856,93,96,7852,741}; //已经越界了 for(i=0; i<10; i++) printf("a[%d] %d\n",i,a[i]); }
练习:
1. 从键盘中输入一个字符串保存到char类型数组,请你将它逆序存放
hello --》olleh
#include <stdio.h> #include <string.h> int main() { int i; int count=0; int temp; //定义数组存放字符串 char buf[50]; printf("请输入一个字符串!\n"); scanf("%s",buf); printf("字符串原本的内容是:%s\n",buf); //逆序保存 buf[0]--buf[最后一个字符] printf("sizeof求出来的是整个数组的长度:%lu\n",sizeof(buf)); //自己动手求出刚才你输入的字符串实际长度 for(i=0; i<50; i++) //遍历整个数组 { if(buf[i]!=0) count++; else break; } printf("字符串的长度是:%d\n",count); printf("直接使用strlen求出字符串的实际长度:%d\n",strlen(buf)); for(i=0; i<count/2; i++) // buf[0] buf[count-1] { temp=buf[i]; buf[i]=buf[count-(i+1)]; buf[count-(i+1)]=temp; } printf("逆序之后buf是:%s\n",buf);
2. 从键盘输入任意一个数,求出它的二进制,然后把这个二进制保存到char binary[32]中
754
#include <stdio.h> #include <string.h> int main() { int sum, i = 0; char sz[100], temp; printf("请输入一个整数:\n"); scanf("%d", &sum); do { sz[i] = sum % 2 + '0'; //整型转字符型,将整数的值+48,‘0’的ASCII码值 //printf("%d",sz[i]); i++; sum /= 2; //printf("%d",sz[i]); } while (sum != 0); for (i = 0; i < strlen(sz) / 2; i++) { temp = sz[i]; sz[i] = sz[strlen(sz) - 1 - i]; sz[strlen(sz) - 1 - i] = temp; } printf("\n%s\n", sz); }
三、C语言提供的关于字符串操作的常用函数
求字符串的实际长度 strlen()
字符串的拷贝 strcpy()和strncpy()
字符串的拼接 strcat()
字符串的比较 strcmp()
\n \t \0 \b都是一个字符
#include <stdio.h> #include <string.h> int main() { int i; int a[10]; for (i = 0; i < 10; i++) printf("a[i] %d\n", a[i]); char buf1[20] = {0}; //数组如果没有赋值,它里面存放的是垃圾数(随机数) char buf2[20] = {0}; printf("请从键盘输入字符串!\n"); scanf("%s", buf1); scanf("%s", buf2); printf("合并之前: buf1 is:%s buf2 is:%s\n", buf1, buf2); //字符串的拼接 //strcat(buf1,buf2); //把buf2和buf1合并成一个新的字符串,然后保存到buf1中 //printf("合并之后: buf1 is:%s buf2 is:%s\n",buf1,buf2); //字符串的比较,不是根据长度比较,根据字符串中字母的排列顺序比较 int ret = strcmp(buf1, buf2); // abc aet if (ret > 0) //说明buf1大于buf2 { printf("buf1大于buf2\n"); } else if (ret < 0) //说明buf1小于buf2 { printf("buf1小于buf2\n"); } else //说明buf1等于buf2 printf("buf1等于buf2\n"); //拷贝一个字符串的前面n个字节 char buf3[20] = {0}; strncpy(buf3, "hello", 2); //把hello最前面的2个字节数据拷贝到buf3中 printf("buf3 is:%s\n", buf3); }
四、作业:
1. 定义int数组,任意输入10个整数,对它们从小到大排序
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <stdio.h> /* * 1. 定义int数组,任意输入10个整数,对它们从小到大排序 */ int main() { int i, j, a[10], cup; printf("请输入10个不同数据:\n"); for (i = 0; i < 10; i++) { scanf("%d", &a[i]); } for (i = 0; i < 9; i++) { for (j = i + 1; j < 10; j++) { if (a[i] > a[j]) { cup = a[i]; a[i] = a[j]; a[j] = cup; } } } printf("排列顺序从小到大为:"); for (i = 0; i < 10; i++) { printf("%d ", a[i]); } printf("\n"); return 0; }
2. 任意输入一个字符串,要求去除掉这个字符串中重复的字符(重复字符只保留一个);
google --》gole
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <stdio.h> #include <string.h> int main() { char str[100]; char c; int len = 0; int i, j, k; scanf("%s", str); len = strlen(str); for (i = 0; i <= len - 1; i++) { for (j = i + 1; j <= len - 1; j++) { if (str[i] == str[j]) { for (k = j; k <= len - 1; k++) //将这个字符丢掉,将后面的字符向前移动 { str[k] = str[k + 1]; } len--; //字符长度减少 j--; //重新匹对 } } } str[len] = '\0'; printf("%s\n", str); return 0; }
3. 编写程序,把你输入带2位小数的数字,转换成字符串保存到一个字符数组中
scanf("%f",) 15.23
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <stdio.h> #include <string.h> int main() { int i = 0; int count = 0; char buf1[20] = {0}; //存放整数部分的数组 char buf2[10] = {0}; //存放小数部分的数组 char temp; float a; int d; //存放整数部分 printf("请输入一个小数!\n"); scanf("%f", &a); //取整 int b = (int)a; float c = a - b; // 125.68; c=0.8 d=6 //把整数b转换成字符串存放 while (b != 0) { buf1[i++] = b % 10 + '0'; b /= 10; } //将存放的字符颠倒回来 for (i = 0; i < strlen(buf1) / 2; i++) // buf[0] buf[count-1] { temp = buf1[i]; buf1[i] = buf1[strlen(buf1) - (i + 1)]; buf1[strlen(buf1) - (i + 1)] = temp; } //小数部分 buf2[0] = '.'; while (c != 0) { d = (int)(c * 10); //printf("小数部分:%d\n", d); c = c * 10 - d; count++; if (count > 2) { if (d > 5) { buf2[2] = buf2[2] + 1; } count = 0; break; } buf2[count] = d + '0'; } //拼接字符,并保存在buf1中 strcat(buf1, buf2); printf("%s\n", buf1); }