第 11 章 字符串和函数
1.设计并测试一个函数,可以读取n个字符(包括空格、制表符和换行符),把结果存储在一个数组中,这个数组的地址通过参数来传递。
<span style="font-size:18px;">/*设计并测试一个函数,可以读取n个字符(包
括空格、制表符和换行符),把结果存储在一个
数组中,这个数组的地址通过参数来传递。*/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void funin(char *p,int n);
int main()
{
int n;
char *a;
printf("请输入字符串长度:");
scanf("%d",&n);
a=(char*)calloc(n+1,sizeof(char));
printf("input your string:\n");
funin(a,n+1);
puts(a);
free(a);//释放第一维指针
return 0;
}
void funin(char *p,int n)
{
int i = 0;
for (i=0; i<n; i++)
*(p+i) = getchar();
*(p+i) = '\0';
}</span>
2.设计并测试一个函数,其功能是读取输入行里的第一个单词到数组,并丢弃该行中其他的字符。一个单词的定义是一串字符,其中不含空格、制表符和换行符。
<span style="font-size:18px;">/*设计并测试一个函数,其功能是读取输入行里
的第一个单词到数组,并丢弃该行中其他的字符。
一个单词的定义是一串字符,其中不含空格、制
表符和换行符。*/
#include <stdio.h>
#include <ctype.h>
void getword(char *p);
int main(void)
{
char s[100];
printf("input your string:");
gets(s);
getword(s);
printf("%s\n",s);
return 0;
}
void getword(char *p)
{
int k,t;
for(k=0; isspace(*(p+k)); k++)
;
for(t=k; !isspace(*(p+t)); t++)
;
*(p+t)='\0';
for(; *(p+k)!='\0'; p++)
*p=*(p+k);
*p='\0';
}
/*isspace(c)函数,当c为空白符时,返回非零值,否则返回零。
空白符指空格、水平制表、垂直制表、换页、回车和换行符。*/</span>
3. strncpy(s1,s2,n)函数从s2复制n个字符给s1,并在必要时截断s2或为其填充额外的空字符。如果s2的长度等于或大于n,目标字符串就没有标志结束的空字符。函数返回s1。自己编写这个函数,并在一个使用循环语句为这个函数提供输入的完整程序中进行测试。
<span style="font-size:18px;">/* strncpy(s1,s2,n)函数从s2复制n个字符
给s1,并在必要时截断s2或为其填充额外的空
字符。*/
#include <stdio.h>
#include <ctype.h>
void strncpy(char *s1,char *s2,int n);
int main(void)
{
char s1[100];
char s2[50];
int n;
printf("input first string: s1=");
gets(s1);
printf("input second string: s2=");
gets(s2);
printf("input the replace lenth: n=");
scanf("%d",&n);
strncpy(s1,s2,n);
//printf("after replace, the string is:%s\n",s1);
puts(s1);
return 0;
}
void strncpy(char *s1,char *s2,int n)
{
while(*s1++!='\0') ;//找出s1结束的地方
s1--;
*s1=*s2;//链接s2的地址
n--;
while(n>0&&*s2!='\0')
{
*++s1 = *++s2;
n--;
}
*++s1='\0';
}</span>
4.编写一个函数,其功能是使输入字符串反序。在一个使用循环语句为这个函数提供输入的完整程序中进行测试。
<span style="font-size:18px;">
/* 编写一个函数,其功能是使输入字符串反序。
在一个使用循环语句为这个函数提供输入的完整
程序中进行测试.*/
#include <stdio.h>
#include <ctype.h>
void inverted(char *s);
int main(void)
{
char s[100];
printf("input your string: s=");
gets(s);
inverted(s);
printf("after inverting,the string is: %s",s);
return 0;
}
void inverted(char *s)
{
int i,n;
char temp;
for(n=0; *(s+n)!='\0'; n++);
n--;
for(i=0; i<n-i; i++)
{
temp = s[i];
s[i] = s[n-i];
s[n-i] = temp;
}
}</span>
5.编写一个函数。其参数为一个字符串,函数删除字符串中的空格。在一个使用循环语句为这个函数提供输入的完整程序中进行测试,知道用户输入空行。对于任何输入字符串,函数都应该适用并可以显示结果。
<span style="font-size:18px;">/* 编写一个函数。其参数为一个字符串,函数删除字符串中的空格.*/
#include <stdio.h>
#include <ctype.h>
void delblank(char *s);
int main(void)
{
char s[100];
printf("input your string: ");
gets(s);
delblank(s);
printf("after change,the string is: %s", s);
return 0;
}
void delblank(char *s)
{
char *p;
while (*s!='\0')
{
if (*s==' ')
{
p=s;
while(*p!='\0')
{
*p=*(p+1);
p++;
}
s--;
}
s++;
}
}</span>
6.编写一个程序。功能是读取输入,直到遇到EOF,并报告单词数、大写字母数、小写字母数、标点符号数和数字字符数。使用ctype.h系列函数。
<span style="font-size:18px;">#include <stdio.h>
#include <ctype.h>
int main(void)
{
int word=0,upper=0,lower=0,punct=0,digit=0,begin=0;
char ch;
while((ch=getchar())!=EOF)
{
if(isalpha(ch))//判断输入的是否是字母
{
if (begin==0)//单词开始计数标志
{
word++;
begin=1;
}
}
else begin=0;
if( isupper(ch)) upper++;
if(islower(ch)) lower++;
if(ispunct(ch)) punct++;
if(isdigit(ch)) digit++;
}
printf("word:%d\nupper:%d\nlower:%d\npunct:%d\ndigit:%d\n",word,upper,lower,punct,digit);
return 0;
}</span>