#include<stdio.h>
int main()
{
int a[5][5];
int(*p)[5];
p = a;//p存放了数组a的首元素地址
printf("%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);
//&p[4][2] -->*(*(p+4)+2)
//%p打印的是该结果的补码,所以是十六进制存储在内存中
return 0;
}
#include<stdio.h>
#include<string.h>
#include<assert.h>
void nixuhanshu(char* str)//字符串逆序
{
assert(str);
int len = strlen(str);
char*left = str;
char* right = str + len - 1;
while (left<right)
{
char cmp = *left;
*left = *right;
*right = cmp;
left++;
right--;
}
}
int main()
{
char arr[256] = { 0 };
//scanf_s("%s", arr,sizeof(arr));//scanf不会进行边界检查,而scanf_s会进行边界检查,所以加
//一个sizeof(数组名)给个边界
//scanf读取到空格时就停止,所以用gets()函数读取一行赋给
//arr,不用scanf
gets_s(arr);
nixuhanshu(arr);
printf("逆序后的字符串=%s\n", arr);
return 0;
}
#include<stdio.h>
int main()
{
int a = 0;
int b = 0;
scanf_s("%d%d", &a,&b);
int sum = 0;
int ret = 0;
for (int i = 0; i < b; i++)
{
ret = ret * 10 + a;
sum += ret;
}
printf("%d\n", sum);
return 0;
}
#include<math.h>
#include<stdio.h>
int main()//水仙花数
{
for (int i = 0; i <=100000; i++)
{
//1.判断i是几位数
int n = 1;//每个i的位数不同,要放在for循环中去重置
int k = i;//如果直接用i去运算,那i需要在后面不断重置
int sum = 0;//存放总和
while (k /= 10)//如果除10后不为0,则还有位数
{
n++;
}
k = i;
while (k)//如果该while循环中使用的是i,则i被运算后
{
sum += pow(k % 10, n);
k /= 10;
}
if (sum == i)
{
printf("%d ", sum);
}
}
return 0;
}
#include<stdio.h>
int main()//打印棱形
{
int line = 0;//行数
scanf_s("%d", &line);
//1.打印上半行
for (int i = 0; i <line ; i++)
{
for (int j = 0; j <line-1-i ; j++)
{
printf(" ");
}
for (int a = 0; a <2*i+1 ; a++)
{
printf("*");
}
printf("\n");
}
//打印下半行
for (int j = 0; j < line - 1; j++)
{
for (int i = 0; i <1+j ; i++)
{
printf(" ");
}
for (int a = 0; a <2*(line-1-j)-1; a++)
{
printf("*");
}
printf("\n");
}
return 0;
}
//喝汽水,一瓶汽水一元,两个空瓶可以换一瓶汽水,给20元,可以买多少汽水
#include<stdio.h>
int main()
{
int money = 0;
int total = 0;//有多少瓶汽水
int empty = 0;//空瓶数量
scanf_s("%d", &money);
total = money;
empty = money;
//交换汽水
while (empty>=2)
{
total += empty / 2;
empty = empty / 2 + empty % 2;
}
printf("total=%d\n", total);
return 0;
}
//调整奇数偶数顺序
//奇数全部都位于偶数前面
#include<stdio.h>
void move(int arr[],int sz)
{
int left = 0;
int right = sz - 1;
while (left<right)
{
while ((left < right) && arr[left] % 2 == 1)
{
left++;
}
while ((left<right) && arr[right] % 2 == 0)
{
right--;
}
if (left < right)
{
int cmp = arr[left];
arr[left] = arr[right];
arr[right] = cmp;
}
}
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int sz = sizeof(arr) / sizeof(arr[0]);
move(arr,sz);
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
//实现一个函数,可以左旋字符串中的k个字符
//例:ABCD左旋一个字符得到BCDA
//ABCD左旋两个字符得到CDAB
#include<string.h>
#include<stdio.h>
#include<assert.h>
//暴力求解法
void move(char* arr, int k)
{
assert(arr);
int sz = strlen(arr);
for (int j = 0; j < k; j++)
{
char cmp = *arr;
for (int i = 0; i < sz-1 ; i++)
{
*(arr + i) = *(arr + i + 1);
}
*(arr+sz - 1) = cmp;
}
}
//三步翻转法
//abcdef
//ba fedc//先将ab逆序,再将cdef逆序
//cdefab//再整体逆序
void revers(char* left, char* right)
{
while (left<right)
{
char cmp = *left;
*left = *right;
*right = cmp;
left++;
right--;
}
}
void move(char* arr, int k)
{
int len = strlen(arr);
revers(arr, arr + k - 1);
revers(arr + k, arr + len - 1);
revers(arr, arr + len - 1);
}
int int_move(char* s1, char* s2)
{
int len = strlen(s1);
for (int j = 0; j <len-1 ; j++)//一共六种情况,逆序六次
{
move(s1, 1);//每次逆序一个,如果每次逆序次数用j进行递增,则s1可能需要重置
int ret=strcmp(s1, s2);
if (ret == 0)
return 1;
}
return 0;
}
#include<string.h>
#include<stdio.h>
#include<assert.h>
#include<string.h>//更高效的查找逆序后的字符串是否相等
int int_move(char* s1, char* s2)
{
assert(s1);
assert(s2);
int len1 = strlen(s1);
int len2 = strlen(s2);
//如果字符串s1的长度和s2的长度不同,则s2肯定逆序后得不到s1
if (len1 != len2)
return 0;
//1.在s1字符串中追加一个s1字符串,如果使用stcat函数追加,
//则会因为找不着\0而报错(在自己对自己追加时)
//(stcat函数的实现原理是将字符串中的内容从头开始一个个往后追加,
//但是第一个元素会把s1的\0给代换掉,所以追加到结尾时无\0无法停止)
//而用其他字符串追加时自带有\0,不会报错.
//所以使用strncat函数,除了要追加的目标和内容,还增加了要追加的字符个数,
//可以规避\0而导致的错误
strncat_s(s1,100,s1, 6);
//2.判断s2指向的字符串是否是s1的字符串的子串
char* ret=strstr(s1, s2);
if (ret == NULL)//不是就返回空指针
return 0;
else//是就返回s1中(找到的子集)/s2的首元素地址
return 1;
}
int main()
{
//写一个函数判断两个数组逆序后是否相同
//相同返回1,不同返回0
char arr1[] = "abcdef";
char arr2[] = "bcdefa";
int ret= int_move(arr1, arr2);
if (ret == 1)
printf("Yes\n");
else
printf("No\n");
return 0;
}
#include<stdio.h>//二维数组中元素的查找
int FindNum(int arr[3][3], int k, int*px, int*py)
{
int x = 0;
int y = *py - 1;
while (x<*px && y<*py)
{
if (arr[x][y] < k)
{
x++;
}
else if (arr[x][y] > k)
{
y--;
}
else
{
//通过x,y传来的地址去改变x,y的值
*px = x;
*py = y;
return 1;
}
}
return 0;
}
int main()
{
int arr[3][3] = { {1,2,3},{4,5,6},{7,8,9} };
int k = 0;
scanf_s("%d", &k);
int x = 3;
int y = 3;
//返回型参数,拖出去打一顿再遍体鳞伤的回来
int ret=FindNum(arr, k, &x, &y);
if (ret == 1)
{
printf("找到了,下标是:%d %d\n",x,y);
}
else
{
printf("找不到\n");
}
return 0;
}
C语言指针进阶与之前的一些练习
于 2022-09-09 15:12:08 首次发布