输出函数
int puts(const char *s);
功能:标准设备输出s字符串,在输出完成后自动输出一个'n'。
int fputs(const char * str, FILE * stream); //文件操作
功能: 将str所指定的字符串写入到stream指定的文件中, 字符串结束符 ' ' 不写入文件。
简单测试:
#include <stdio.h>
int main(int argc, char const *argv[])
{
char str[] = "hello world!";
puts(str); //会自动加上一个 'n'
fputs(str,stdout); // 不会自动加上 'n'
return0;
}
sizeof()和strlen()的区别
注意:
strlen()
从首元素开始,到结束符为止的长度,结束符不算(遇到' '结束); -
而 sizeof()
则不管遇不遇到' '
都会计算整个数据类型大小;
#include <stdio.h>
#include <string.h>
int main(int argc, char const *argv[])
{
char buf[] = "hello";
// strlen 从首元素开始,到结束符为止的长度,结束符不算(遇到' '结束)
int len = strlen(buf);
printf("strlen(buf) = %dn", len); //5
printf("sizeof(buf) = %dn", sizeof(buf)); // 6 这个还包括 ' '
char buf2[] = " hello";
printf("strlen(buf2) = %dn", strlen(buf2)); // 0
printf("sizeof(buf2) = %dn", sizeof(buf2)); // 7 注意不要忘记最后还有一个 ' '
char buf3[100] = "zxzxin";
printf("strlen(buf3) = %dn", strlen(buf3)); //6
printf("sizeof(buf3) = %dn", sizeof(buf3)); //100
return0;
}
字符串拷贝strcpy()和strncpy()
注意两者区别:
char *strcpy(char *dest, const char *src)
:把src所指向的字符串复制到dest所指向的空间中,' '也会拷贝过去。(如果参数dest所指的内存空间不够大,可能会造成缓冲溢出的错误情况。) char *strncpy(char *dest, const char *src, size_t n)
:把src指向字符串的前n个字符复制到dest所指向的空间中,是否拷贝结束符看指定的长度是否包含' '。
#include <stdio.h>
#include <string.h>
int main(int argc, char const *argv[])
{
//strcpy: 把src所指向的字符串复制到dest所指向的空间中,' '也会拷贝过去
char src[] = "hello world!";
char dest[100] = "aaaaaaaaaaaaaaaaaaaaaaa";
strcpy(dest,src);
printf("dest = %sn", dest);// hello world! 不会输出后面的aaaa, 因为' '也拷贝在后面了
// strncpy : 把src指向字符串的前n个字符复制到dest所指向的空间中,是否拷贝结束符看指定的长度是否包含' '。
char dest2[100] = "aaaaaaaaaaaaaaaaaaaaaaa";
strncpy(dest2, src, strlen(src));
printf("dest2 = %sn", dest2); //hello world!aaaaaaaaaaa
//但是如果拷贝的长度大于strlen(src)
char dest3[100] = "aaaaaaaaaaaaaaaaaaaaaaa";
strncpy(dest3, src, strlen(src)+1);
printf("dest3 = %sn", dest3); //hello world!
return0;
}
strcat()、strncat()、 strcmp()、strncmp()
char *strcat(char *dest, const char *src);
: 将src字符串连接到dest的尾部, ‘ ’
也会追加过去;char *strncat(char *dest, const char *src, size_t n);
: 将src字符串前n个字符连接到dest的尾部, ‘ ’
也会追加过去;int strcmp(const char *s1, const char *s2);
: 比较 s1 和 s2 的大小,比较的是字符ASCII码大小; int strncmp(const char *s1, const char *s2, size_t n);
:比较 s1 和 s2 前n个字符的大小,比较的是字符ASCII码大小;
测试:
#include <stdio.h>
#include <string.h>
int main(int argc, char const *argv[])
{
char s1[] = "abc";
char s2[] = "abcd";
int flag = strcmp(s1, s2);
printf("flag = %dn",flag);// <0
char s3[] = "abc";
char s4[] = "Abcd";
int flag2 = strncmp(s3, s4, 3); //指定比较前3个字符
printf("flag2 = %dn",flag2);// >0s
printf("-------------strcat和strncat------------n");
char src[] = " hello mike";
char dst[100] = "abc";
//把src的内容追加到dst的后面
//strcat(dst, src); //dst = "abc hello mike"
strncat(dst, src, strlen(" hello")); //指定长度追加 dst = "abc hello"
printf("dst = %sn", dst);
return0;
}
输出:
flag = -100
flag2 = 32
-------------strcat和strncat------------
dst = abc hello
sprintf()、sscanf()
int sprintf(char *str, const char *format, ...);
: 根据参数format字符串来转换并格式化数据,然后将结果输出到str指定的空间中,直到出现字符串结束符 ' ' 为止。 int sscanf(const char *str, const char *format, ...);
: 从str指定的字符串读取数据,并根据参数format字符串来转换并格式化数据。
#include <stdio.h>
int main(int argc, char const *argv[])
{
printf("--------------sprintf-------------------n");
int n = 10;
char ch = 'a';
char buf[10] = "hello";
char dest[30];
sprintf(dest,"n = %d, ch = %c, buf = %sn", n, ch, buf);
printf("dest: %s", dest); // 注意这里没有加上 'n' 但是之前里面有
printf("--------------sscanf-------------------n");
// sscanf和spirnf相反 这里从dest中读取
int n2;
char ch2;
char buf2[10];
sscanf(dest, "n = %d, ch = %c, buf = %sn", &n2, &ch2, &buf2); //记得加上 &
printf("n2 = %dn", n2);
printf("ch2 = %cn", ch2);
printf("buf2 = %sn", buf2);
printf("-----------字符串提取注意的地方--------------n");
// 从字符串中提取 内容最好按照空格进行分割 ,不然有可能提取不出来
// 1. 按照空格分割 --> 正确
char buf3[] = "aaa bbb ccc";
char a[10],b[10],c[10];
sscanf(buf3, "%s %s %s", a,b,c); //注意没有&
printf("a = %s, b = %s, c = %sn", a, b, c);
// 2. 按照逗号分割 --> 错误
char buf4[] = "aaa,bbb,ccc";
char a2[10],b2[10],c2[10];
sscanf(buf4, "%s,%s,%s", a2,b2,c2); //注意没有&
printf("a2 = %s, b2 = %s, c2 = %sn", a2, b2, c2);
return0;
}
strchr()、strstr()、strtok()
char *strchr(const char *s, char c);
: 在字符串s中查找字母c出现的位置; char *strstr(const char *haystack, const char *needle);
: 在字符串haystack中查找字符串needle出现的位置; char *strtok(char *str, const char *delim);
①来将字符串分割成一个个片段。当strtok()在参数s的字符串中发现参数delim中包含的分割字符时, 则会将该字符改为 字符,当连续出现多个时只替换第一个为 ;
②在第一次调用时:strtok()必需给予参数s字符串;
③往后的调用则将参数s设置成NULL,每次调用成功则返回指向被分割出片段的指针;
#include <stdio.h>
#include <string.h>
int main(int argc, char const *argv[])
{
printf("-------------strchr------------n");
char str1[] = "aaabbbccc";
char *p = strchr(str1, 'b');
printf("p = %sn", p);
printf("-------------strstr------------n");
char str2[] = "ddddabcd123abcd333abcd";
char *p2 = strstr(str2, "abcd");
printf("p2 = %sn", p2);
printf("-------------strtok------------n");
char str3[100] = "adc*fvcv*ebcy*hghbdfg*casdert";
char *s = strtok(str3, "*"); //将"*"分割的子串取出
while (s != NULL){
printf("%sn", s);
s = strtok(NULL, "*");//往后的调用则将参数s设置成NULL,每次调用成功则返回指向被分割出片段的指针
}
return0;
}
输出:
-------------strchr------------
p = bbbccc
-------------strstr------------
p2 = abcd123abcd333abcd
-------------strtok------------
adc
fvcv
ebcy
hghbdfg
casdert
函数
-
函数内部,包括()内部的形参变量,只有在调用时分配空间,调用完毕自动释放;
-
return
和exit()
函数区别,只要一调用exit()
函数(不管在什么地方),整个程序就结束,但是只有在main
函数中调用return
才会结束程序; -
声明函数加不加
extern
关键字都一样, 声明函数可以不指定形参名称,只指定形参形参类型,但是定义不可以。 -
头文件一般是放函数声明;
-
多个文件中(同一项目),不能出现同名函数(static除外)。这就是为什么
.h
文件只放函数的声明,不放函数的定义; -
防止头文件重复包含: 当一个项目比较大时,往往都是分文件,这时候有可能不小心把同一个头文件
include
多次,或者头文件嵌套包含。
防止办法:
①#ifndef
方式;
#ifndef __SOMEFILE_H__
#define __SOMEFILE_H__
// 声明语句
#endif
②#pragma once
方式。
原文始发于微信公众号(泷羽sec-心安):C语言笔记5
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论