一、定义字符串
way-one:字符串常量(用双引号括起来的内容)--静态存储类别
若字符串常量之间没有间隔或用空格隔开,C语言会自动将其串联起来。
e.g.
printf("Hello" "World");
-----HelloWorld
注:要在字符串内部使用双引号,需要在双引号前面加上一个“ \ ”。
way-two:char类型数组
way-three:指向char的指针
二、字符串数组和初始化
1.数组表示法:
一维:char m[ ]=NULL; 和 char m [ 50 ]=NULL;
二维:char [2][10];
2.指针表示法:
一维:char *m = NULL;
二维:char *m[ 10] ;
注:指定数组大小时,要让数组的元素个数至少比字符串长度多1(容纳" \0 ")
三、字符串输入
1、scanf ()函数
2、gets ()函数
注:已经不推荐使用了,如果输入的字符串过长,会导致缓冲区溢出。
gets(words); 注 words为字符串数组
3、fgets()函数
fgets(words,10,stdin)
为了处理包含空格的字符串,使用fgets()
函数
注:第一个参数为数组名。
第二个参数为输入字符的最大数量。若参数为n,则读入n-1个字符,或者遇到第一个换行符为止。
第三个参数指明要读入的文件,若从键盘输入的数据,以stdin作为参数。
其中,fgets()会自动存储换行符。
处理掉换行符方法:
while (words [ i ] != '\n')
i++;
words[ i ] = ' \0 ';
4、gets_s()函数
gets_s(words,10)函数
gets_s()会自动丢弃换行符
若输入的字符串太长有两种处理方法:
1】继续使用超出的字符
#include <stdio.h>
#define STLEN 10
int main(void)
{
char words[STLEN];
puts("Enter strings (empty line to quit):");
while (fgets(words, STLEN, stdin) != NULL && words[0] != '\n')
fputs(words, stdout);
puts("Done.");
return 0;
}
2】丢弃输入行的超出字符
#include <stdio.h>
#define STLEN 10
int main(void)
{
char words[STLEN];
int i;
puts("Enter strings (empty line to quit):");
while (fgets(words, STLEN, stdin) != NULL && words[0] != '\n')
{
i = 0;
while (words[i] != '\n' && words[i] != '\0')
i++;
if (words[i] == '\n')
words[i] = '\0';
else // must have words[i] == '\0'
while (getchar() != '\n')
continue;
puts(words);
}
puts("done");
return 0;
}
5、s_gets()函数
需要自己写源代码,不能直接使用
char *s_gets(char *st,int n)
{
char *ret_val;
int i = 0;
ret_val = fgets(st,n,stdin);
if (ret_val != NULL)
{
while (st[i] != '\n' && st[i] != '\0')
i++;
if (st[i] == '\n')
st[i] = '\0';
else
while (getchar() != '\n')
continue;
}
return ret_val; //返回指向该字符串的指针
}
四、字符串的输出
1、puts()函数
puts(字符串的地址)
注:puts()在显示字符串时会自动在其末尾添加一个换行符。
被视为地址的东西:双引号括起来的内容是字符串常量,而且被视为该字符串的地址;存储字符串的数组名也被视为地址。
2、fputs()函数
fputs(字符串数组名,stdout)
其中,stdout是标准输出,可以将内容打印在显示器上。
而且fputs()不会自动在末尾添加换行符。
3、printf()函数
五、自定义字符串的输入/输出函数
1、put1()//打印字符串,不添加\n
#include <stdio.h>
void put1(const char *string)
{
while (*string != '\0') //while (*string)
putchar(*string++);
}
或
#include <stdio.h>
void put1(const char *string)
{
int i=0;
while (string[i]!='\0')
putchar(string[i++]);
}
2、put2() // 打印一个字符串,并统计打印的字符数。
#include <stdio.h>
int put2(const char *string)
{
int count = 0;
while (*string)
{
putchar(*string++);
count++;
}
putchar('\n');
return 0;
}
六、字符串函数(包含在string.h)
1、strlen()函数
用于统计字符串的长度。返回字符串长度,不包含\0。
int strlen(const char *s)
{
int idx=0;
while (s[idx] != '\0')
{
idx++;
}
return idx;
}
2、strcat()函数
用于拼接字符串,把拼接后形成的新的字符串作为第一个字符串,第二个字符串不变。
其中,strcat()函数的类型是char *,strcat()函数返回第一个参数,即:拼接后新字符串的地址。
3、strncat()函数
也用于拼接字符串,第三个参数指定最大拼接字符数。
e.g. strncat(word,words,10);
拼接13个字符或遇到空字符停止。
4、strcmp()函数
用于比较两个字符的大小。
若strcmp(A,A); 返回0;若strcmp(B,A); 返回1;若strcmp(A,B); 返回-1。
说明:如果在字母表中第一个字符位于第二个字符前面,strcmp()中就返回负数;反之,strcmp()则返回正数。若不等,返回的是两个字符串的最后一个字符的ASCII码之差。
int strcmp(const char *s1,const char *s2)
{
int idx=0;
while (s1[idx]=s2[idx] && s1[idx]!='\0')
{
idx++;
}
return s1[idx]-s2[idx];
}
int strcmp(const char *s1,const char *s2)
{
while (*s1=*s2 && *s1!='\0')
{
s1++;
s2++;
}
return *s1-*s2;
}
5、strncmp()函数
strncmp()在比较两个字符串时,可以比较到字符的不同地方,也可以只比较第三个参数指定的字符数。
#include <stdio.h>
#include <string.h>
#define LSTNUM 6
int main()
{
const char *list[LSTNUM]=
{
"produce","provide",
"process","probably",
"problem","preview"
};
int cnt=0;
int i;
for (i=0;i<LSTNUM;i++)
{
if (strncmp(list[i],"pro",3)==0)
{
printf("Found:%s\n",list[i]);
cnt++;
}
}
printf("total is %d\n",cnt);
return 0;
}
6、strcpy()函数
该函数第二个参数指向的字符串被拷贝至第一个参数指向的数组中。
拷贝出来的字符串被称为目标字符串,最初的字符串被称为源字符串。
strcpy(目标字符串,源字符串)
7、strncpy()函数
第三个参数指明可拷贝的最大字符数。
8、sprintf()函数
注:声明在stdio.h中。sprintf()的第一个参数是目标字符串的地址,第二个参数是格式化字符串,第三个字符串是待写入项的列表。
e.g.sprintf(words,"%s-%s-%s",a,b,c);
sprintf()把组合后的字符串存储在数组words中而不是显示在屏幕上。
七、字符串排序
选择排序法:for m=首元素至m=倒数第二个元素
for m-第二个元素至最后一个元素
比较第n个元素与第1个元素,如果第n个元素更大,交换这两个元素的值。
void strsort(char *strings [] , int n)
{
char *i;
int top, seek;
for (top=0;top<n-1;top++)
{
for (seek=top+1;seek<n;seek++)
{
if (strcmp(strings[top],strings[seek])>0)
{
i=strings[top];
strings[top]=strings[seek];
strings[seek]=i;
}
}
}
八、字符串转换数字
这些函数包含在stdlib.h头文件中。
atoi()函数,把字符串转换成int类型的值。
atof()函数,把字符串转换成double类型的值。
atol()函数,把字符串转换成long类型的值。
strtol()函数,把字符串转换成long类型的值,且可以识别和报告字符串首字符是不是数字。
strtod()函数,把字符串转换成double类型的值,且可以识别和报告字符串首字符是不是数字。