笔记(5)字符串和字符串函数

**********************************************************************************
-------字符串和字符串函数
#include<stdio.h>
int main()
{
     
      charhear[]="How are you!";//char *heard="How areyou!";//*(head++)     
      const char*p="Hello!What is your name?";
      const char*mp[3]={"Hello!","I'm zbg","Nice to me you,I'm wwk"};
      puts(p);  //mp数组实际并不存放字符串,它只存放字符串的地址
                        //*mp[0],mp[0][0]表示第一个字符串的第一个字符
      for(inti=0;i<24;i++)
            putchar(*(p++));
          puts("");
      for(intj=0;j<3;j++)
            puts(mp[j]);
                  return 0;
}
     
-------------------------------------------------------------------------------
      char*p1="Peter";
      p1[0]='T';//不允许!!!
      printf("Peter");
      printf(":Beware the %s!\n","Peter");
     
-------------------------------------------------------------------------------
     
      char*p2;
      while(gets(p2)!=NULL)//可以检测是否到了文件末尾
       
      一、空指针的空字符的区别:
      1、空指针是一个地址,而空字符是一个char类型的数据对象,其值为0.
      2、数值上两者都可用0表示,但它们的概念不同:
            NULL是一个指针,而0是一个char类型的常量
     
      二、使用gets(),当输入的数据超出预留存储区时,多出的字符简单的溢出到相邻的
            内存区,而fgets()让用户指定最大读入字符数
            重要一点,gets()很不安全!!!!!!!!!!!
       
-------------------------------------------------------------------------------
一个fgets()的示例

#include<stdio.h>
#define MAX 80
int main()
{
      charname[MAX];
      char*ptr;
      puts("Whatis your name?");
      ptr=fgets(name,MAX,stdin);
      printf("%s!Hi~%s!\n",name,ptr);
      return0;
      //运行结果:
      //What isyour name?
      //KangKang
      //KangKang
      //!Hi~KangKang
      //!
      //-----------------------------------------------------------
        问题在于fgets()将换行符也存储到字符里(而gets()是将其丢弃)
          解决方法:可用strchr()来定位和删除换行符
        char *strchr(const char *s,intc);
        该函数返回一个指向字符串s中存放字符c的第一个位置的指针,如果没找到,
        函数就返回一个空指针NULL。
        char linep[80];
        char *fine;

        fgets(line,80,stdin);
        find=strchr(line,'\n');//查找换行符
        if(find)                              //如果该地址不为NULL
                *fine='\0';                //就把一个空字符放在这里
            else  ...
      -----------------------------------------------------------     
}


-------------------------------------------------------------------------------
  gets()丢掉输入的换行符
  fgets()存储输入的换行符
  puts()为输出添加换行符
  fputs()不为输出添加换行符
//puts()的使用,只需给出字符串参数的地址
        char str1[30]="abcdefghijklmnopqrstuvwx yz";>
      char*str2="012345678";
      puts(&str1[5]);//输出为:fghijklmnopqrstuvwxyz
      puts(str2+5);  //输出为:5678

----自定义字符串输入/输出函数-------------------------------------------------
以一个类似puts()函数为例,其可以计算输出字符个数
#include<stdio.h>
int puts2(char *string)
{
      intcount=0;
      while(*string)//当string指向空字符时,*string的值为0,将结束循环
      {
            putchar(*string++);
                count++;
      }
      putchar('\n');
      printf("Icount %d characters\n",count);
      returncount;

}
int main()
{
      //intcount;count=
      puts2("12345678");
      //printf("There are %dcharacters\n",count);
return 0;
}

-------------------------------------------------------------------------------
--字符串函数#include<string.h>

    char str1[]="abcd";
    char str2[]="1234";
    strlen(str1)=4,strcat(str1,str2)="abcd1234",strncat(str1,str2,3)="abcd123",
    strcmp(str1,str2),strncmp(str1,str2,3),strcpy(),strncpy()-->>较为谨慎的选择(类似fgets())
    1、对于strcmp()如果str1>str2(字符串在字母表中的顺序,确却的说是按机器编码顺序--所有字符),
    strcmp()返回一个负数;如果相同,返回0;如果str1<str2,返回一个正数。确切的数值则依赖于
    不同的C实现。
    2、char *str;
          strcpy(str,"The C of Tranquility");//存在一个问题
        函数将把字符串"The C ofTranquility"复制到str指定的地址中,但是str没有初始化,
        因此这个字符串可能别复制到任何地方!
        注意:声明一个数组将为数据分配存储空间:而声明一个指针只为一个地址分配存储空间。
    3、函数strncpy(target,source,n)从source把n个字符(或空字符之前的字符,由二者中最先满足的
          那个决定何时停止)复制到target,n应比目标数组大小少一,预留给空字符‘\0’
    4、sprintf()是在stdio.h中声明的,作用和printf一样,但它是写到字符串里而不是写到输出显示。
          #include<stdio.h>
        #define MAX 20
        int main()
        {
          charformal[2*MAX+10];
          charname[MAX]="Always Online";
          doubleprize=500000.00;
          sprintf(formal,"%-15s: $%6.2f",name,prize);
          puts(formal);
          return0;
          }
      sprintf()命令获取输入,并把输入格式化为标准形式后存放在字符串formal中   
 
-------------------------------------------------------------------------------
--ctype.h字符函数toupper()和ispunct()

  用toupper()实现将整个字符串转换为大写,ispunct()计算字符串标点字符的个数
示例:
#include<stdio.h>
#include<string.h>
#include<ctype.h>
void ToUpper(char *str)
{
      while(*str)
      {
            *str=toupper(*str);
            str++;
      }
}
int PunctCount(const char *str)
{
      intcount=0;
        while(*str)
      {
              if(ispunct(*str))
                  count++;
            str++;
      }
      returncount;
}
int main()
{
      charstr[30];
      gets(str);
      ToUpper(str);
      puts(str);
      printf("Thatline has %d punctutation characters.\n",PunctCount(str));
return 0;
}
-------------------------------------------------------------------------------

#include<stdio.h>
#include<string.h>
int  main(void)
{
      charnote[]="See you at the snack bar.";
      char*ptr,*p1;
     
      p1=note+strlen(note);
      while(--p1>=note)
              puts(p1);
     
      ptr=note;
      puts(ptr);//See you at the snack bar.
      puts(++ptr);//ee you at the snack bar.
      note[7]='\0';
      puts(ptr);    //ee you
      puts(++ptr);//e you
           
return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值