putchar 和 getchar
putchar
int putchar(int c);
向标准输出写一个字符
返回写了几个字符,EOF(-1)表示写失败
getchar
int getchar(void);
向标准输入读入一个字符
返回类型是int是为了返回EOF(-1)
结束热键:
Windows ->Ctrl-Z
Unix->Ctrl-D
应用实例
#include <stdio.h>
int main(int argc,char const *argv[])
{
int ch;
while ( (ch = getchar()) != EOF ){
putchar(ch);
}
printf("EOF\n");
return 0;
}
string.h
strlen
size_t strlen(const char *s);
返回字符串长度,不包括结尾的‘\0’
strlen的应用及自定义
#include <stdio.h>
#include <string.h>
int mylen(const char *s){
int count = 0;
while ( s[count] != '\0' ){
count++;
}
return count;
}
int main(int argc,char const *argv[])
{
char str[] = "hello";
printf("%d\n",strlen(str));
printf("%d\n",sizeof(str));
printf("%d\n",mylen(str));
return 0;
}
运行结果如下
strcmp
int strcmp(const char *str1,const char *str2);
比较两个字符串,返回:
0:str1==str2
n:str>str2 //返回str1-str2(由左边开始取第一个不相等的字符的ASCII码计算)
-n:str1<str2
#include <stdio.h>
#include <string.h>
int mycmp(const char*s1,const char*s2){
int index = 0;
while ( s1[index] == s2[index] && s1[index] != '\0' ){
index++;
}
return s1[index] - s2[index];
}
int mycmp1(const char*s1,const char*s2){
while ( *s1 == *s2 && *s1 != '\0' ){
s1++;
s2++;
}
return *s1 - *s2;
}
int main(int argc,char const *argv[])
{
char str1[] = "abc";
char str2[] = "abc";
char str3[] = "aBb";
printf("%d\n",strcmp(str1,str2));
printf("%d\n",strcmp(str1,str3));
printf("%d\n",strcmp(str3,str1));
printf("%d\n",mycmp(str3,str1));
printf("%d\n",mycmp1(str3,str1));
return 0;
}
strcpy
char strcpy(char *restrict dst,char *restrict src);
把src的地址拷贝到dst
restrict表明src和dst两个指针的地址不重叠;
返回dst(为了能链接起代码)
复制一个字符串
char *dst = (char*)malloc(strlen(src)+1);
strcpy(dst,src);
#include <stdio.h>
#include <string.h>
char mycpy(char *dst,const char *src){
int index = 0;
while ( src[index] != '\0' ){
dst[index] = src[index];
index++;
}
dst[index] ='\0';
return *dst;
}
char mycpy1(char *dst,const char *src){
char *ret = dst; //后面做过运算的dst无法返回
while ( *src ){
*dst = *src;
dst++;
src++;
}
*dst ='\0';
return *ret;
}
int main(int argc,char const *argv[])
{
char str1[] = "abc";
char str2[] = "aaaaaaaaaaaaa";
char str3[] = "bbbbbbbbbbbbb";
char str4[] = "ccccccccccccc";
strcpy(str2,str1);
printf("%s\n",str2);
mycpy(str3,str1);
printf("%s\n",str3);
mycpy1(str4,str1);
printf("%s\n",str4);
return 0;
}
strcat
char strcpy(char *restrict str1,char *restrict str2);
把str2拷贝到str1后面,接成一个长的字符串
返回s1
s1必须具有足够的空间
代码应该怎么写?
在这里插入代码片
安全问题
strcpy和strcat可能出现目标地址没有足够空间的问题。
strchr
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc,char const *argv[])
{
char str[] = "hello";
printf("%s\n",str);
char *p = strchr(str,'l');
printf("%s\n",p);
p++;
char *t = (char*)malloc(strlen(p)+1);
strcpy(t,p);
printf("%s\n",t);
free(t);
return 0;
}
如何输出p前面的字符
*p = '\0';
char *t = (char*)malloc(strlen(p)+1);
strcpy(t,str);
printf("%s\n",t);
free(t);