首页 > 代码库 > 字符串与字符串函数

字符串与字符串函数

定义字符串的方法:
1.字符串常量
2.char数组 //这种方法数组名会看作首元素的地址的同义词,不可用++,增量运算符只能用于变量名前。 2.可以用*(head+1)这种格式 3.数组元素是变量,数组名是地址常量
3.cahr指针 //是一个指针,是变量
4.字符串数组

 

 

举例:
char character[23]= "fsdfdsf" "sdfdf";这是可以的


//把字符串看作指针
#include<stdio.h>
int main(void)
{
printf("%s,%p,%c\n","We","are",*"space farers");
return 0;
}

 


const char m[] ={‘d‘,‘d‘,‘\0‘ };//最后的标志结束的空格符不存在,就只是一个字符数组而不是一个字符串了

 

 

 

 

 

一种特殊情况:
#include<stdio.h>
int main(void)
{
char * p1 = "Klingon";
p1[0] = ‘F‘;
printf("Klingon");
printf(": Beware the %ss!\n","Klingon");

}
//编译器如果允许,可能会导致内存访问错误。编译器可能选择内存中的同一个单个的拷贝,来表示说有相同字符串的文字。意思就是说Klingon在内存中只存一份。
//于是结果中所有Klingon都变成了Flingon

 


字符串数组:
const char *rt[3] = {"sdf","dfafads","dfsd"};
rt实际上不存放字符串,它只是存放字符串的地址(字符串存在程序用来存放常量的那部分内存中)

rt[0]看作表示第一个字符串,*rt[0]看作表示第一个字符串的第一个字符,也可以用rt[][];

 


字符串输入首先要创建一个存储空间

3种读取字符串的函数: scanf()、gets()、fgets()、


1.gets()
gets()会读取换行符之前(不包括换行符)的所有字符,在这些字符后添加一个空字符(‘\0‘),然后把这个字符串交给调用它的程序。
它将读取换行符并将其丢弃,这样下一次读取就会在新的一行开始。
会返回字符串的地址

它的原型构造:
char *gets(char *s)
{
....
return (s);

}

返回的指针与传递给它的是同一个指针,输入字符串只有一个备份,放在作为函数参数传递过来的地址中。
如果出错或遇到文件结尾,就返回一个空(或0)地址,此时什么都不会读

错误检测:
while(gets(name)!=NULL);


while((ch = getchar())!=EOF);

 

 


fgets()函数修正了gets()预留的存储区溢出的问题
第二个参数指定最大读入字符数,如果参数为n,最多读入n-1个字符或读完一个换行符为止,读取到换行符会把它存到字符串内
第三个参数说明读哪一个文件,可以用在stdio.h中定义的stdin作为参数

ptr = fgets(name,MAX,stdin);//从键盘读数据

strchr()来定位和删除换行符

 

scanf常用来读取字符

 

 

 

 

 

字符串的输出


puts只要给出字符串参数的地址,会自动添加一个换行符,与gets()不读取换行符对应
字符数组字符串的名字也被看作地址
char str[] = "an apple";

puts(&str[5]);
puts(str);

 

 

fputs()可以使用stdout作为参数来进行输出显示,fputs()并不为输出自动添加换行符,与fgets()读取换行符相对应

 

printf()可以格式化多种数据类型,一行上输出多个字符串更加简单

 

ANSI C 用头文件string.h给出这些函数的原型,之前是strings.h

strlen()得到字符串的长度 strlen(string)
strcat()将第二个字符串的一份拷贝添加到第一个字符串的结尾,返回第一个参数的值(char *)
strncat(bugs,addon,13),中直到添加13个字符或遇到空字符为止
strcmp()字符串参数相同就返回0,两个指针比较的话,只会比较两个字符串的地址,第一个在前为负,按机器编码顺序,一般是ASCII码,用关系运算符对字符进行比较
可以用input[ct][0] != ‘\0‘来检测空输入行
strncmp()的第三个参数来指定比较的字符数

 

strcpy() 例子: char word[4][5]; .... {strcpy(word[i],temp);i++}
第一个参数可以不指向数组的开始


strncpy(),如果源字符串还没结束就达到限制,就不会添加空字符。所以一般: strncpy(word[i],temp,num-1); word[i][num-1] = ‘\0‘;//下标是从0开始的

 

sprintf()是在stdio.h中声明的,sprintf(formal,"%s,%d",last,num);//其中formal是数组


ANSI C库一共有2多个处理字符串的函数。

 

 

ctype.h应用于字符串的个别字符


命令行参数:
#include<stdio.h>
int main(int argc,char *argv[])
{
int count;

printf("The command line has %d arguments: \n",argc-1);
for(count = 1;count < argc; count++)
printf("%d: %s\n",count,argv[count]);
printf("\n");

 

}


第一个参数时命令行中的字符串数,如repeat luoj (有两个,其中repeat是可执行文件名),argv【0】存放程序本身的名字,把随后的第一个字符串赋给argv[1].

 

#include<stdio.h>
#include<console.h>
int main(int argc,char *argv[])
{

...
argc = ccommand(&argv);

}

Macintosh操作系统不使用命令行,可以用上面方法进行模拟

 

 

字符串转化成其他类型:
stdlib.h atoi();atof();atol(); strtol(),strtoul();strtod();

 

字符串与字符串函数