c++之数组与字符串

1、数组翻转

#include<stdio.h>

//数组逆置
int main()
{
int array[10] = { 1, 4, 6, 2, 3, 8, 10, 20, 11, 23 };
int i;
//1、利用for循环
/*for (i = 0; i < 5; i++){
int temp = array[i];
array[i] = array[9 - i];
array[9 - i] = temp;
}*/


//2、利用while循环
int min = 0;
int max = 9;
while (min < max){
int temp = array[min];
array[min] = array[max];
array[max] = temp;
min++;
max--;
}

for (i = 0; i < 10; i++){
printf("%d\n",array[i]);
}
return 0;

}


2、求素数

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
//素数:即对一个整数,它只能被1和它本身整除
//如:3,5,7,11,13,17,。。。

//问题:将从3到100之间的所有素数打印出来,并求和
int main()
{
int i, j;
double sum = 0;
for (i = 3; i < 400000; i++){
int status = 0;//标志位
for (j = 2; j < i; j++){
if (i%j == 0){
// printf("%d不是素数\n", i);
status = 1;
break;
}
}
if (status == 0){
//printf("%d是素数\n", i);
sum += i;
}
}

printf("sum=%d\n", sum);
return 0;
}


3、求水仙花数

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
//水仙花数:即一个n位数,n>=3,它的每个位上的数字的n次幂的和,等于这个数本身
//如:153:1^3+5^3+3^3=153;370:3^3+7^3+0^3=370.

//问题:将从100到999之间的所有水仙花数打印出来
int main()
{
int i;
for (i = 100; i < 1000; i++){
int num = pow(i / 100, 3.0) + pow(i % 100 / 10, 3.0) + pow(i % 10, 3.0);
if (num == i)
printf("%d\n",num);
}

return 0;
}


4、字符串输入与输出

#include<stdio.h>
#include<stdlib.h>
int main()
{
//scanf:是从输出设备输入 sscanf:是从指定格式化字符串中读取
char aa[100] = "asasd";
char bb[100] = "dssdd";
int a1 = 0, b1 = 0;
//sprintf(aa, "123,456");
//相当于
sprintf(aa, "%d,%d", 123, 456);//用sprintf库函数将整型转化成字符串
sscanf(aa, "%d,%d", &a1, &b1);
printf("a1=%d,b1=%d\n", a1, b1);
return 0;

//sprintf
char s1[100] = "hello";
int i = 100;
sprintf(s1, "he world,i=%d\n",i);
printf("%s\n", s1);//
return 0;

char str[100] = { 0 };
//scanf("%s", str);//scanf是以回车键、空格都作为输入完成标识的,
//printf("%s\n", str);

gets(str);//gets()以回车键作为输入结束标识,空格不是输入结束标示,所以用gets()可以实现输入带空格的字符串
//gets()和scanf()一样存在缓冲区溢出的情况
//gets()不能用类似“%s”或者“%d”之类的字符转义,只能接受字符串的输入
printf("%s\n", str);

//gets()、scanf()实现两个数相加
/*int a, b;
scanf("%d %d", &a, &b);
printf("%d\n", a + b);*/

char a[100];
char b[100];

gets(a);
gets(b);

int i1 = atoi(a);//atoi()将字符串转化为一个整数
int i2 = atoi(b);

double i3 = atof(a);//atoi()将字符串转化为一个浮点数
double i4 = atof(b);

//atol 转化成long

printf("%d\n", i1+i2);
printf("%d\n", i3 + i4);

//fgets()
char s[100] = { "hello world" };
fgets(s, sizeof(s)-1, stdin);/*第一个参数表示char的数组,第二个参数表示数组的大小,单位:字节,第三个参数stdin代表标准输入的意识*/
//fgets()是安全的,不存在缓冲区溢出的问题,调用fgets()的时候,只要能保证第二个参数小于数组实际的大小,那么就能避免缓冲区溢出的问题

//printf("%s\n", s);
puts(s);//puts()函数会自动在输出完成之后打印一个'\n'出来
//fputs是puts的文件操作版本
char ss[100] = "hello";
fputs(ss, stdout);

return 0;
}


5、字符数组与字符串

#include<stdio.h>
int main()  
{
//字符数组初始化
//char array[100] = { 0 };
//char array[100] = { 'a', 'b', 'c', 'd' };
//char array[100] = "abcd";
char array[] = "hello world";

printf("%s\n", array);
printf("%d\n", sizeof(array));//12 100

//对字符串进行排序
int i, j;
for (i = 0; i < sizeof(array)-1; i++){
for (j = 1; j < sizeof(array)-1 - i; j++){
if (array[j - 1]>array[j]){
char temp = array[j - 1];
array[j - 1] = array[j];
array[j] = temp;
}
}
}

printf("%s\n", array);
return 0;
}


6、字符串翻转

#include<stdio.h>
int main()
{
//字符数组初始化
char array[100] = "hello world";//ASCII字符串
printf("%s\n", array);
printf("%d\n", sizeof(array));//100 


//对字符串进行翻转
int i = 0;
while (array[i++]);//求字符串长度
printf("%d\n", i);//12

int min = 0;
int max = i-2;

while (min < max){
char temp = array[min];
array[min] = array[max];
array[max] = temp;
min++;
max--;
}
printf("%s\n", array);

/*ASCII:一个字节存放一个字符;GBK:用两个字节存放一个汉字;UTF-8:用三个字节存放一个汉字*/

char str[100] = "你好世界";//GBK编码的汉字
printf("%s\n", str);
printf("%d\n", sizeof(str));//100 

//对汉字进行翻转
int j = 0;
while (str[j++]);//求字符串长度
printf("%d\n", j);//9

int min1 = 0;
int max1 = j - 2;

while (min1 < max1){
char temp = str[min1];
str[min1] = str[max1-1];
str[max1-1] = temp;

   temp = str[min1+1];
str[min1+1] = str[max1];
str[max1] = temp;

min1+=2;
max1-=2;
}
printf("%s\n", str);

char strr[100] = "你好世界";//UTF-8编码的汉字
printf("%s\n", strr);
printf("%d\n", sizeof(strr));//100 

//对汉字进行翻转
int k = 0;
while (strr[k++]);//求字符串长度
printf("%d\n", k);//13

int min2 = 0;
int max2 = k - 2;

while (min2 < max2){
char temp = strr[min2];
strr[min2] = strr[max2 - 2];
strr[max2 - 2] = temp;

temp = strr[min2 + 1];
strr[min2 + 1] = strr[max2-1];
strr[max2-1] = temp;

temp = strr[min2 + 2];
strr[min2 + 2] = strr[max2];
strr[max2] = temp;

min2 += 3;
max2 -= 3;
}


printf("%s\n", strr);
return 0;
}


7、字符串操作函数

#include<stdio.h>
#include<string.h>
int main()
{
//strtok分割字符串
/*字符在第一次调用时strtok()必须给予参数s字符串,往后的调用则将参数s设置成NULL,每次调用
 成功则返回指向被分割出片段的指针*/
char buf[100] = "abc@def@igk";
char *p = strtok(buf, "@");
while (p)
{
printf("%s\n", p);
p = strtok(NULL, "@");
}
return 0;

//strstr查找子串
//char * strstr(char* _Str,const char * _SubStr);
//在参数_Str中查找参数_SubStr指定子串,找到返回子串_SubStr在_Str中所在位置,否则返回NULL
char ccc[100] = "dfvfkdvdf";
const char *S1 = strstr(ccc, "fkd");
printf("%s\n", S1);//fkdvdf
const char *Ss1 = strstr(ccc, "cs");
printf("%s\n", Ss1);//null
return 0;

//strchr查找字符 
//char * strchr(char* _Str,int _Ch);
//在参数_Str中查找参数_Ch指定字符,找到返回字符_Ch在_Str中所在位置,否则返回NULL
char cc[100] = "dfvfkdvdf";
const char *S = strchr(cc, 'f');
printf("%s\n", S);//fvfkdvdf
const char *Ss = strchr(cc, 'c');
printf("%s\n", Ss);//null
return 0;

//strcpy strncpy
char a[20] = "hello";
char b[100] = "endadsawer";
//printf("%s\n", strcpy(a, b));//溢出
printf("%s\n", strncpy(a, b,5));
return 0;

//strcmp strncmp 
//c++中,两个string类型的字符串可以直接比较是否相等
//如果第一个参数的ASCII小于第二个参数,则返回-1,反之,则返回1,如果相等则返回0
char s2[100] = "hwellowwwe";
char s3[100] = "hwelloworla";
if (strncmp(s2,s3,6)==0)//意识是只比较前6个字符
//if (strcmp(s2, s3) == 0)
printf("相同\n");
else
printf("不相同\n");

return 0;

//size_t strlen() //size_t相当于unsigned int
char s[20] = { "hello world" };
size_t len = strlen(s);//得到字符串长度,返回一个字符串中有效字符的量(不包含字符串结尾的0)
printf("len=%d\n", len);

//strcat strncat
char s1[100] = "abc23454656767";
//strcat(s, s1);//将两个字符串合并,结果放入第一个参数后面
//strcat也存在缓冲区溢出的问题
strncat(s, s1, 6);//合并的时候限制追加多少个字符
puts(s);

return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值