putchar函数和getchar函数,它们提供了字符的输入和输出操作;puts函数和gets函数,它们提供了字符串的输入和输出操作。
putchar函数的作用是向标准输出打印一个字符。使用方法如下:
char c;
putchar(c);
getchar函数的作用是从标准输入以字符型形式读入值赋值给一个字符。使用方法:
char c;
c = getchar();
范例1
#include
int main(void){
char c = 0;
printf("Please input a character:");
c = getchar();
/*等效于printf("c = %$d\n",c)*/
putchar('c');
putchar(' ');
putchar('=');
putchar(' ');
putchar(c);
putchar('\n');
return 0;
}
puts函数的作用是向标准输出打印一个字符串。使用方法如下:
char str[] = "Linux Terminal";
puts(str);
str的有效内容直到检测到第一个’\0’。如果函数执行成功,该函数的函数值为一个非负数,否则返回值为EOF。
gets函数的作用是从标准输入读取一个字符串赋给其他参数。
char str[20] = "\0";
gets(str);
str的有效内容一直到检测到一个’\n’或EOF。str只能获取其有效空间内的字符,超出去的会产生比较麻烦的后果。
范例2
#include
#define SIZE 20
int main(void){
char str[SIZE] = "\0";
int i = 0;
gets(str);
i = puts(str);
printf("i = %d\n",i);
return 0;
}
strcpy函数和strncpy函数实现字符串复制的功能。
strcat函数和strncat函数实现了字符串拼接的功能。
字符串复制的标准形式如下:
strcpy(str1,str2);
执行语句后,strncpy函数会将字符串str2复制到字符串str1中。因此str2的值不能超过str1的有效内存空间。
范例3
#include
#include
#define MAX_LENGTH 20
int main(void){
char str1[] = "It is hot!";
char str2[MAX_LENGTH] = "\0";
char str3[] = "Nice to meet you!";
printf("The length of str1: %d\n",sizeof(str1));
printf("The length of str3: %d\n",sizeof(str3));
strcpy(str2,str3);
printf("str2:[%s]\n",str2);
strcpy(str1,str3);
printf("str1:[%s]\n",str1);
printf("str2:[%s]\n",str2);
return 1;
}
由于str2的范围大于str3,所以将str3复制到str2中可以;而str1的范围小于str3,所以将str3复制到str1会出现问题。
strncpy函数可以选择将str2的前n个字符复制到str1的前n个字符空间。如果str2有效字符不足n个,那么该函数会将str1的其余空间复制为’\0’。
strncpy(str1,str2,n)
在使用时要保证n不能大于str1所占的内存大小。
范例4
#include
#include
int main(void){
char str1[] = "long time";
char str2[] = "long time";
char str3[] = "LONG\0TIME";
int i = 0;
int len1 = strlen(str1);
int len3 = strlen(str3);
printf("strlen(str1) = %d\n",len1);
printf("strlen(str3) = %d\n",len3);
strncpy(str1,str3,strlen(str1));
strncpy(str2,str3,strlen(str3));
putchar('[');
for(i=0;i<len1;i++)
putchar(str1[i]);
puts("]");
putchar('[');
for(i=0;i<len1;i++)
putchar(str2[i]);
puts("]");
return 0;
}
strcat函数和strncat函数提供了字符串拼接功能。函数声明如下:
char * strcat(char * str1,char * str2);
char * strncat(char *str1,char * str2,int n);
将str2的有效字符拼接到str1的有效字符后面,因此str1的空间要足够存储str1和str2的所有有效字符。 strncat是将str2的前n个字符复制到str1的后面。
范例5
#include
#include
#define SIZE 20
int main(void){
char str1[SIZE] = "A\0A";
char str2[SIZE] = "BBB";
strcat(str1,str2);
puts(str1);
strcat(str1,str2,2);
puts(str1);
return 0;
}
字符串之间不能用关系操作符直接进行比较。C语言中为了比较两个字符串大小使用strncmp函数,标准形式如下:
strncmp(str1,str2,n);
执行此函数,会比较字符串str1和str2的前n个字符。比较规则如下:
使用strncmp函数需要包含头文件string.h
范例6
#include
#include
int main(void){
char str1[] = "long time";
char str2[] = "long time";
char str3[] = "lonG time";
int length = strlen(str1);
printf("str1 = \"%s""\n",str1);
printf("str2 = \"%s""\n",str2);
printf("str3 = \"%s""\n",str3);
printf("strncmp(str1,str2,%d) = %d\n",length,strncmp(str1,str2,length));
printf("strncmp(str3,str1,%d) = %d\n",length,strncmp(str3,str1,length));
printf("strncmp(str1,str3,%d) = %d\n",length,strncmp(str1,str3,length));
printf("strncmp(str1,str2,3) = %d\n",length,strncmp(str1,str3,3));
printf("g - G = %d\n",'g'-'G');
return 0;
}
strupr函数将字符串中的所有小写字母转换成大写字母。
strlwr函数将字符串中的所有大写字母转换成小写字母。
strupr(str1);
strlwr(str2);
这两个函数操作的结果都保存在原字符数组上,两个函数的返回值都是字符数组的首地址。
范例7
#include
#include
int main(void){
char str1[] = "Great Wall";
char str2[] = "Great Wall";
puts(str1);
printf("strupr-->");
puts(strupr(str1));
printf("strlwr-->");
puts(strlwr(str2));
return 0;
}
//使用getchar函数实现一个函数,要求其功能与gets函数一致。
#include
#include
#define SIZE 20
char * my_gets(char * str){
char c = 0;
c = getchar();
while(c != ' '
&& c != '\t'
&& c != '\0'){
*str++ = c;//保存到字符串
c = getchar();//读取第一个字符
}
return str;
}
int main(void){
char str1[SIZE] = "\0";
my_gets(str1);
puts(str1);
return 0;
}
//使用putchar函数实现一个函数,要求其功能与puts函数一致。
#include
#include
#define SIZE 20
void my_puts(char * str){
while(* str != '\0')//若不等于终止符
putchar(*str++);//打印当前字符
printf("\n");
}
int main(void){
char str1[SIZE] = "Barbe a papa";//定义第一个字符串
my_puts(str1);
return 0;
}
在C程序中,可以用两种方法访问一个字符串:(1)用字符数组存放一个字符串,然后输出该字符串;(2)用字符指针指向一个字符串。
最后两个练习都是通过指针访问字符串的方法来表示字符串,具体格式如下:
char *str = "hello C language";
在这里没有定义字符数组,在程序中定义了一个字符指针变量str,用字符串常量“hello C language"对它初始化。C语言对字符串常量是按字符数组处理string的,在内存中开辟了一个字符数组用来存故该字符串常量。对字符指针C变量str初始化,实际上是把字符串第1个元素的地址(即存放字符串的字符数组的首元素地址)赋str。在输出项中给出字符指针变量名str,则系统先输出它所指向的一个字符数据,然后自动使str加1,使之指向下一个字符,然后再输出一个字符…如此直到遇到字符串结束标志’\0’为止。