一、gets()函数
gets()函数在其函数声明中声明括号中的类型为char *。但当我尝试下列操作时却给出了警告:p没有使用。
#include<stdio.h>
int main()
{
char *p;
gets(p);
printf("%s",p);
return 0;
}
后来得知,char*只负责指向某一段字符串。程序中出现的没有赋给某个变量的双引号内的字符串,是属于静态存储类。把指针初始化到指向这个静态存储的字符串,只是引用了这个字符串。而初始化字符数组为这个字符串,是说把这个字符串复制到了一个分配好的变量存储空间,之后再修改的,就是数组里的字符。
所以如果想通过char *初始化字符串,要么指向一段字符串,否则只能用p = (char *)malloc(NUM*sizeof(char)); 申请空间来进行初始化。
gets() 函数遇到换行符丢弃换行符,储存其他字符并在末尾添加空字符('\0')。与其对应的puts() 函数在结尾会多输出一个换行符。不过gets() 函数并不会检测录入的字符串是否越界,所以存在风险。C11标准新加入的gets_s()函数会抛弃多余的字符串,可以有效避免这个问题,但可能会导致中止或退出程序。
二、strlen() 函数
该函数可以测出某一字符串的长度(从1计数),遇到空格不会终止会继续向下计数。该函数包括在string.h中。
三、strcat() 函数
该函数括号中有两个参数,作用是把第二个字符串的备份附加在第一个字符串末尾并返回char*指针(拼接第二个字符串后的
第一个字符串的地址)。不过同样该函数存在越界问题,还好有strncat() 函数可以完美解决这个问题。strncat() 会加入第
三个参数(数字)来规定最大添加字符数
四、strcmp() 函数
该函数是把第二个字符串与第一个字符串进行比较。如果相通则返回0,如果第一个字符串的字典序位于第二个字符串之前,
则返回一个一个复数,否则返回一个正数。在ACS II中,大写字母位于小写字母之前。
不过应当注意,该函数是比较的是字符串,而不是单个字符!一定是“ ” ,而不是‘ ’。
五、strcpy() 函数
该函数是把第二个字符串复制给第一个字符串,并返回char*,即第一个字符串的地址。不过应当注意在gets() 中同样遇到
的问题,第一个字符串必须经过初始化才可以复制。例如下面代码就有问题:
char *str;
strcpy(str,"hahaha"); //有问题
很明显该指针没有经过初始化。strcpy可以接受两个字符串指针或数组作为参数,但第一个指针必须指向一个数据对象。不过第一个参数不必指向字符串的开始,这个属性可以拷贝数组的一部分。
同样为了防止越界,C还提供了strncpy() 函数,第三个参数(数字)指明可以拷贝的最大字符数。利用这一特性还可以筛选出带有一小段固定字符串的字符串来。在strcpy(target,cource,n) 中,如果拷贝到n个字符还没有拷贝完源字符串,就不会
拷贝空字符。所以应当把n设为第一个数组大小-1,并把数组最后一个元素设置为空字符:
#define TARGET 7
strcpy(qwords[i],temp,TARGET-1);
qwords[i][TARGET-1]='\0';
六、 sprintf() 函数(stdio.h中)
该函数是把多个元素整合到一个字符串中,可以是数字也可以是字符串。例如:(last:Jack,first:Mick,prize:¥2500)
sprintf(formal,"&s,%s:%f",last,first,prize);
结果为 Jack ,Mick:¥2500