size_t
定义在<stddef.h>, <stdio.h>, <stdlib.h>, <string.h>, <time.h>, <wchar.h>, <sys/types.h>
size_t是一个类型定义,定义了无符号整形,包括unsigned int
、unsigned long
、unsigned long long等
每一个标准C语言实现的函数参数,都应该选择足够大的无符号整形来代表该平台上最大可能出现的对象大小
C语言的关键字
第一类,数据类型:void、char、short、int、long、float、double、sizeof;
第二类,有无符号:signed、unsigned;
第三类,构造类型:struct、union、enum、typedef;
第四类,存储与生命周期:auto、static、extern、register、const、volatile;
第五类,语句:if、else、for、while、do、switch、case、fault、goto、break、continue、return
在嵌入式Linux C语言编程中,为什么要用size_t表示无符号整型?
使用size_t能够提高代码的可移植性、有效性、可读性
具体来讲,一般unsigned int 要比int的数量多一倍,使用size_t可以使标准C函数适应所有可能位数的平台,提高了代码的可移植性和效率;它是一种类型,后面跟的参数代表的是字节大小或数组索引,今后看到不会再以为是自定义的结构体什么了。
C语言中的字符串操作函数
1 strcpy(str1,str2); 将字符串str2复制到字符串str1中,并覆盖str1原始字符串,可用于字符串变量赋值
注意:str1会被清空,然后全部被str2取代;str2的长度不能大于str1,否则会溢出
#include <stdio.h>
#include <string.h>
int main(void)
{
char string[10];
char *str1 = "abcdefghi";
strcpy(string, str1);
printf("%s\n", string); // 输出:abcdefghi
return 0;
}
2 strncpy(str1,str2,n); 将字符串str2中的前n个字符复制到字符串str1的前n个字符中
注意:str1只有前n个字符串被取代(但使用strncpy_s会清空str1的字符串);n的长度不能大于str1和str2的长度,否则会溢出
#include <stdio.h>
#include <string.h>
int main(void)
{
char string[10];
char *str1 = "abcdefghi";
strncpy(string, str1, 3);
string[3] = '\0';
printf("%s\n", string); // 输出:abc
return 0;
}
3 strcat(str1,str2); 将字符串str2添加到字符串str1的尾部
注意:拼接时会先删去str1的'\0',最后在字符串末尾再添加上'\0';内存可能会溢出
#include <string.h>
#include <stdio.h>
int main(void)
{
char destination[25];
char *blank = " ", *c = "C++", *Borland = "Borland";
strcpy(destination, Borland);
strcat(destination, blank);
strcat(destination, c);
printf("%s\n", destination); // 输出:Borland C++
return 0;
}
4 strncat(str1,str2,n); 将字符串str2的前n个字符添加到字符串str1的尾部
注意:除了'\0'以及内存溢出需要注意外,如果n大于字符串src的长度,仅将src全部追加到dest的尾部;
#include<stdio.h>
#include<string.h>
int main()
{
char url[100] = "http://blog.youkuaiyun.com";
char path[30] = "/cpp/u/string/";
strncat(url, path, 1000); // 1000远远超过path的长度
printf("%s\n", url); // 输出;http://blog.youkuaiyun.com/cpp/u/string/
return 0;
}
5 strlen(str1); 计算字符串str1的长度
注意:该函数计算的是字符串实际长度,遇到第一个'\0'结束;sizeof返回的是变量声明后所占的内存数,不是实际长度,sizeof是关键字,而strlen()是函数
#include<stdio.h>
#include<string.h>
int main()
{
char str[5] = "abcd";
printf("strlen(str)=%d, sizeof(str)=%d\n", strlen(str), sizeof(str)); // 输出:strlen(str)=4, sizeof(str)=5
return 0;
}
6 strcmp(str1,str2); 比较两个字符串,str1与str2相等,返回0;str1大于str2,返回一个正数(不一定是1);str1小于str2,返回一个负数(不一定是-1);
strncmp(str1,str2,n); 比较两个字符串的前n个字符
stricmp(str1,str2); 比较两个字符串,大小写不敏感。
这里的大于是指:
自左向右按ASCII值大小逐一比较,遇到不等的字符,ASCII值较大的一方则字符串大
若str1长度大于str2,且str2的字符与str1前面的字符相同,则str1大于str2
#include <string.h>
#include <stdio.h>
int main(void)
{
char *a = "aBcDeF";
char *b = "AbCdEf";
char *c = "aacdef";
char *d = "aBcDeF";
printf("strcmp(a, b) : %d\n", strcmp(a, b)); // 输出:1
printf("strcmp(a, c) : %d\n", strcmp(a, c)); // 输出:-1
printf("strcmp(a, d) : %d\n", strcmp(a, d)); // 输出:0
return 0;
}
7 strchr(str,c); 在str字符串中查找首次出现字符c的位置(从字符串的首地址开始查找)
strrchr(str,c); 在字符串str中从后向前开始查找字符c首次出现的位置
strstr(str1,str2);在字符串str1中查找字符串str2的位置,若找到返回str2第一个字符在str1中的位置的指针,若没找到返回NULL
注意:检测包括最后的‘\0’;返回的地址是字符串在内存中随机分配的地址再加上你所搜索的字符在字符串的位置;
#include <stdio.h>
#include <string.h>
int main()
{
char *s = "0123456789012345678901234567890";
char *p;
p = strchr(s, '5');
printf("%ld\n", s); // 输出:134513940
printf("%ld\n", p); // 输出:134513945
p = strrchr(s, '5');
printf("%ld\n", p); // 输出:134513965
return 0;
}
#include<stdio.h>
#include<string.h>
int main(){
char *str = "HelloWorldHelloWorld";
char *substr = "World";
char *s = strstr(str, substr);
printf("%s\n", s); // 输出:WorldHelloWorld
return 0;
}
8 strpbrk(str1,str2); 依次检验字符串 str1 中的字符,当被检验字符在字符串 str2 中也包含时,则停止检验,并返回该字符位置的指针 注意:不会检索结束符‘\0’
#include<stdio.h>
#include<string.h>
int main(){
char* s1 = "see you again";
char* s2 = "you";
char* p = strpbrk(s1,s2);
if(p){
printf("The result is: %s\n",p); // 输出:The result is: you again
}else{
printf("Sorry!\n");
}
return 0;
}
9 atoi(str); //字符串转换到int整型
atof(str); //字符串转换到double浮点数
atol(str); //字符串转换到long整形
注意:扫描字符串,遇到数字或正负号开始转换,遇到非数字或 \0 结束转换,返回转换的值,包含在stdlib.h头文件
char *str = "125";
int i = atoi(str);
printf("i = %d\n", i);
// 数字转字符串
int j = 10005;
char arr[20];
sprintf(arr, "%d", j); //c语言里面不能直接 + 连接,需要这么格式化
printf("arr = %s\n", arr);
10 char *strtok(char *s, const char *delim); 根据分界符将字符串分割成一个个片段,返回下一个分割后的字符串指针,如果已无从分割则返回NULL
#include <stdio.h>
#include <string.h>
int main()
{
char s[] = "ab-cd : ef";
char *delim = "-: ";
char *p;
printf("%s \n", strtok(s, delim));
// 输出:ab
// cd
// ef
while((p = strtok(NULL, delim)))
printf("%s ", p);
printf("\n");
}
11 char *strerror(int errnum); 返回指向错误信息字符串的指针
#include <stdio.h>
#include <errno.h>
int main(void)
{
char *buffer;
buffer = strerror(errno);
printf("Error: %s\n", buffer); // 输出:Error: Success
return 0;
}
12 extern void bzero(void *s, int n);
置字节字符串s的前n个字节为零且包括‘\0’,一般来说n通常取sizeof(s),将整块空间清零。
bzero无返回值,使用strings.h头文件,目前POSIX.1-2008标准里已经没有这个函数了,推荐使用memset替代bzero。
#include <stdio.h>
#include <string.h>
int main(void)
{
struct
{
int a;
char s[5];
float f;
} tt;
char s[20];
bzero( &tt, sizeof( tt ) );//等价于memset(&tt,0,sizeof(tt));
bzero( s, 20 );//等价于memset(s,0,20);
printf( "Initial success." );
getchar();
return 0;
}
该部分转载于 https://www.cnblogs.com/eokey/p/11810123.htm