**********************************************************************************
-------字符串和字符串函数
#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;
}
-------字符串和字符串函数
#include<stdio.h>
int main()
{
}
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
一个fgets()的示例
#include<stdio.h>
#define MAX 80
int main()
{
}
-------------------------------------------------------------------------------
//puts()的使用,只需给出字符串参数的地址
----自定义字符串输入/输出函数-------------------------------------------------
以一个类似puts()函数为例,其可以计算输出字符个数
#include<stdio.h>
int puts2(char *string)
{
}
int main()
{
return 0;
}
-------------------------------------------------------------------------------
--字符串函数#include<string.h>
-------------------------------------------------------------------------------
--ctype.h字符函数toupper()和ispunct()
示例:
#include<stdio.h>
#include<string.h>
#include<ctype.h>
void ToUpper(char *str)
{
}
int PunctCount(const char *str)
{
}
int main()
{
return 0;
}
-------------------------------------------------------------------------------
#include<stdio.h>
#include<string.h>
int
{
return 0;
}