2020/03/07 关于size_t、关键字、字符串操作函数

size_t

定义在<stddef.h>, <stdio.h>, <stdlib.h>, <string.h>, <time.h>, <wchar.h>, <sys/types.h>

size_t是一个类型定义,定义了无符号整形,包括unsigned intunsigned longunsigned 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.csdn.net";
    char path[30] = "/cpp/u/string/";
    strncat(url, path, 1000);  // 1000远远超过path的长度
    printf("%s\n", url);  // 输出;http://blog.csdn.net/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

 

 

 

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,我无法生成代码的流程图,但我可以为您解释代码的执行流程。 1.定义一个模板函数read_file,该函数可以读取指定文件中的内容,并将其中出现的关键字记录到哈希表或哈希链表中。 2.函数接收两个参数:filename和table。filename是待读取的文件名,table是用于记录关键字的哈希表或哈希链表。 3.定义一个字符数组filenames,长度为100,用于存储filename的值。 4.使用memset函数将filenames数组中的所有元素初始化为'\0'。 5.使用for循环将filename中的每个字符依次存储到filenames数组中。 6.输出filenames数组中存储的文件名。 7.定义一个fstream对象file,使用filenames中存储的文件名打开文件。 8.定义一个字符串变量words,用于存储从文件中读取的一行内容。 9.如果文件打开失败,则输出提示信息并返回0。 10.定义一个字符串变量s,用于暂存从words中分离出来的关键字。 11.使用while循环逐行读取文件中的内容,直到读取到文件末尾。 12.使用for循环遍历读取到的每个字符,如果该字符是字母或下划线,则将其存储到s字符串中。 13.如果遍历到的字符不是字母或下划线,则表示s字符串中存储的是一个完整的关键字,使用Find函数查找该关键字关键字数组中的位置。 14.如果找到了该关键字,则根据传入的table类型,使用开放地址法或者链地址法将该关键字记录到哈希表或哈希链表中。 15.清空s字符串中的内容,为下一个关键字做准备。 16.关闭文件。 17.返回1,表示文件读取成功。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值