C语言指针的一些题目

时间:2021-02-11 08:35:12

1.将从键盘输入的每个单词的第一个字母转换成大写字母输入时各单词以空格隔开,用“.”结束输入

解体思路:  把输入的字符存入字符数组中直到输入".",然后调用函数,把字符串的第一个字符(即是第一个单词的第一个字母)转换成大写字母,然后之后的每一个单词的第一个字母的怕判断方法是:通过判断一个字符是否是空格,以及空格后是否是字母,若均满足,则将这个字符后面的那个字符就是一个单词的第一个字母,将其转换成大写字母

代码如下:

 #include <stdio.h>
#include <ctype.h> void transfer(char *a , int n )
{
int i; *a = toupper(*a);
for(i=;i<n;i++)
{
if(*a ==' '&&isalpha(*(a+)))
*(a+) = toupper(*(a+));
a++;
}
*a = '\0'; } int main(void)
{
char string[] ;
int i = ; printf("Enter word end with . :");
do
{
scanf("%c",&string[i]);
i++;
} while(string[i-]!='.'); transfer(string,i);
puts(string); return ;
}

2. 从键盘输入一个字符串, 编写一个函数, 在函数中将字符串从第m个字符开始的n个字符复制成另一个字符串

解体思路: 函数的参数为两个字符指针a、b和int型的m, n,从m-1位开始一直到m+n-1把字符指针a中的每一位赋给b

代码如下:

 #include <stdio.h>
void copy(char *a , char *b , int m, int n)
{
int k;
//把字符串a的第i-1位之后的j位赋给b
for(k=m-;k<=m+n-;k++)
{
*b = *(a+k);
b++;
} *b = '\0';
} int main(void)
{
int i , m , n;
char string[] , s[] ; printf("Enter the string: ");
gets(string); //输入string
printf("To copy string's n character from m character to s\n");
printf("Enter m and n : ");
scanf("%d %d",&m,&n); copy(string , s ,m , n); //输出s
for(i=;i<n;i++)
printf("%c",s[i]);
printf("\n"); return ;
}

3.输入8个整数,将其中最大的数与第一个数对换,最小的数与最后一个数对换

解体思路:先申明两个int型的指针,用来指向最大值和最小值,遍历数组把最大值指针指向最大值,最小值指针指向最小值,然后把最大值指针指向的数和数组第一个对换,最小值指针指向的数和数组最后一个对换

代码如下:

 #include <stdio.h>
#define N 8 void change(int *a, int *b,int sad[]);
int main(void)
{
int *max , *min ; //指向最大值和最小值的指针
int a[N] , i ; //输入这8个数
printf("Enter %d integer numbers: ",N);
for(i=;i<N;i++)
scanf("%d",&a[i]); //初始化最大值和最小值指针
max = a;
min = a + N -; for(i=;i<N;i++)
{
if(a[i]>*max) max = a+i; //修改最大值指针的指向
if(a[i]<*min) min = a+i; //修改哦最小值指针的指向
} change(max,min,a); //输出交换后的数组
for(i=;i<N;i++)
printf("%5d",*(a+i));
printf("\n");
return ;
} //把最大值指针指向的数和数组第一个对换
//最小值指针指向的数和数组最后一个对换
void change(int *a, int *b,int sad[])
{
int *first , *last , temp = , tem = ;
first = sad;
last = sad + N -; temp = *first;
*first = *a;
*a = temp; tem = *last;
*last = *b;
*b = tem;
}

4.输入n个整数排序并输出

解体思路: 使用选择排序,每次选择最小的一个数放在序列的起始位置

代码如下:

 #include <stdio.h> 

 void sort(int *a,int n)     // slection sort
{
int i , j;
//从第一个开始,依次选择最小的放在序列的第一位
//外层循环一次,序列向后推一位
for(i=;i<n-;i++)
{
for(j=i+;j<n;j++)
{
if(*(a+j)<*(a+i))
{
int temp;
temp = *(a+j);
*(a+j) = *(a+i);
*(a+i) = temp;
}
}
} } int main(void)
{
int i , n , *p;
int arr[];
p = arr; //输入数组元素个数
printf("Enter n: ");
scanf("%d",&n); //输入数组
printf("Enter %d integer numbers: ",n);
for(i=;i<n;i++)
scanf("%d",p++); //输出输入的数组
p = arr;
for(i=;i<n;i++)
printf("%5d",*(p++));
printf("\n"); //选择排序
sort(arr,n); //输出排序后的数组
p = arr;
for(i=;i<n;i++)
printf("%5d",*(p++));
printf("\n"); return ;
}

5.  输入字符串 内含数字和非数字字符,将数字提取出依次存放到数组中,输出整数的个数和这些数

解题思路:把字符读入字符数组中,然后循环遍历字符数组中的字符判断其是否是数字,若是就存入数组中,并把数字个数加一。

 #include <stdio.h>
#include <string.h> int main()
{
int n, i, j=;
int find_num=; //数字的个数
int a[], num=; //存储数字的数组和存储数字的临时变量
char s[], c; //字符数组和临时字符 //输入字符串
printf("Enter a string: ");
gets(s);
//求出字符串的长度
n = strlen(s); //循环遍历字符数组
for(i=;i<=n;i++)
{
c = s[i];
if(c>=''&&c<='')
{
num = c-''; //将字符(0到9)转换成数字
a[j++] = num;
find_num++;
}
} printf("The number of integers is %d\n",j);
for(i=;i<j;i++)
printf("%d\t",*(a+i)); return ;
}