编程练习六

第 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>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值