学习笔记C语言 open fgets strstr strchr strncpy snprintf函数

本文介绍了C语言中几个常用的字符串处理函数,包括strstr用于查找子字符串,strchr定位字符位置,strncpy进行安全的字符串复制,以及snprintf用于格式化字符串输出。通过示例代码详细解析了这些函数的用法和注意事项,特别是strncpy和snprintf在不同情况下的行为特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

open:
1 /*open.c*/ 2 #include <sys/types.h>
 3 #include <sys/stat.h>
 4 #include <fcntl.h>
 5 /* 6  * O_RDONLY 只读方式打开
 7  * O_WRONLY 只写方式打开
 8  * O_RDWR 可写可读方式打开
 9  * 可选项:
10  * O_APPEND 表示追加
11  * O_CREAT 若此文件不存在就创建,此文件需要提供第三个参数mode,表示该文件的访问权限
12  * O_EXCL 如果同时指定链O_CREATE,并且文件已存在,则出错返回。
13  * O_TRUNC 如果文件已存在,并且以只写或者可读科协方式打开。则将其长度截断为0字节
14  * O_NONBLOCK 对于设备文件,以O_NONBLOCK方式打开可以做非阻塞I/O
15  */16 int main()
17 {
18     int f = 0;
19     //打开文件/home/akae.txt用于写操作,以追加方式打开
20    f = open("/home/akae.txt", O_WRONLY|O_APPEND);
21     close(f);
22     //打开文件/home/akae.txt用于写操作,如果文件不存在就创建它
23     f = open("/home/akae.txt", O_WRONLY|O_CREAT, 0777);
24     close(f);
25     //打开文件/home/akae.txt用于写操作,如果文件存在则截断为0字节,不存在就创建它
26     f = open("/home/akae.txt", O_WRONLY|O_TRUNC);
27     close(f);
28     //打开文件/home/akae.txt用于写操作,如果该文件已存在则报错退出,如果该文件不存在则创建它
29     f = open("/home/akae.txt", O_WRONLY|O_CREAT|O_EXCL);
30     close(f);
31     return 1;
32 }


fgets: 一、读字符串函数fgets函数的功能是从指定的文件中读一个字符串到字符数组中,函数调用的形式为: fgets(字符数组名,n,文件指针); 其中的n是一个正整数。表示从文件中读出的字符串不超过 n-1个字符。在读入的最后一个字符后加上串结束标志'/0'。例如:fgets(str,n,fp);的意义是从fp所指的文件中读出n-1个字符送入字符数组str中。
        例:从e10_1.c文件中读入一个含10个字符的字符串。
#include
main()
{
FILE *fp;
char str[11];
if((fp=fopen("e10_1.c","rt"))==NULL)
{
printf("Cannot open file strike any key exit!");
getch();
exit(1);
}
fgets(str,11,fp);
printf("%s",str);
fclose(fp);
}

  本例定义了一个字符数组str共11个字节,在以读文本文件方式打开文件e101.c后,从中读出10个字符送入str数组,在数组最后一个单元内将加上'/0',然后在屏幕上显示输出str数组。输出的十个字符正是例10.1程序的前十个字符。

  对fgets函数有两点说明:

  1. 在读出n-1个字符之前,如遇到了换行符或EOF,则读出结束。

  2. fgets函数也有返回值,其返回值是字符数组的首地址。
strstr:

在C标准库中有模板,即strstr函数,其原型是char*strstr(const char*s1,const char* s2);

  这个函数的作用是在s1中查找子串s2,如果找到,则返回s1中s2的位置。否则返回NULL。
 1 #include <stdio.h>
 2 #include<string.h>
 3 
 4 char * strrstr(char const *s1,char const *s2){
 5  char *p2s1=(char*)s1;
 6  char *p2s2=(char*)s2;
 7 
 8 int i,j,m,n,k;
 9 i=k=0;
10 j=0;
11 while(i<strlen(s1)&&j<strlen(s2))
12 {
13  if(*(p2s1+i)==*(p2s2+j))
14  {
15  i++;
16  j++;
17  }
18 else
19  {
20  j=0;k++;
21  i=k;//可用于记录原来i的位置 ;
22 
23   
24  }
25 }
26 
27 if(j>=strlen(s2))//判断找到字符串的条件
28  {
29  printf("找到字符串%s",s2);
30  return (p2s1+i);
31 } 
32 else
33  {
34      printf("未找到字符串%s\n",s2); 
35       return NULL;
36  }
37 
38 
39 }
40 int main()
41 {
42 char a[]="abcdefghijkl";
43 char b[]="fgi";
44 
45 char* c;
46 c=strrstr(a,b);
47 
48 
49 return 0;
50 
strchr:  
查找某字符在字符串中首次出现的位置
  char * strchr (const char *str, int c);
【参数】str 为要查找的字符串,c 为要查找的字符。

strchr() 将会找出 str 字符串中第一次出现的字符 c 的地址,然后将该地址返回。

注意:字符串 str 的结束标志 NUL 也会被纳入检索范围,所以 str 的组后一个字符也可以被定位。

【返回值】如果找到指定的字符则返回该字符所在地址,否则返回 NULL。

返回的地址是字符串在内存中随机分配的地址再加上你所搜索的字符在字符串位置。设字符在字符串中首次出现的位置为 i,那么返回的地址可以理解为 str + i。

提示:如果希望查找某字符在字符串中最后一次出现的位置,可以使用 strrchr() 函数。
例:查找字符5首次出现的位置。
 
     
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. int main(){
  5.     char *s = "0123456789012345678901234567890";
  6.     char *p;
  7.     p = strchr(s,'5');
  8. printf("%ld\n", s);
  9.     printf("%ld\n", p);
  10. system("pause");
  11.     return0;
  12. }
输出结果:
12016464
12016469
4196024
4196029(我的虚拟机运行结果;这个地址位于 代码段区域)
strncpy:

C/C++中的strncpy()函数功能为将第source串的前n个字符拷贝到destination串,原型为:

char * strncpy ( char * destination, const char * source, size_t num );

各个参数的含义显而易见,其中返回值与destination相同。


这个函数会出现三种情况:
1、num<source串的长度(包含最后的'\0'字符):那么该函数将会拷贝source的前num个字符到destination串中(不会自动为destination串加上结尾的'\0'字符);
2、num=source串的长度(包含最后的'\0'字符):那么该函数将会拷贝source的全部字符到destination串中(包括source串结尾的'\0'字符);
3、num>source串的长度(包含最后的'\0'字符):那么该函数将会拷贝source的全部字符到destination串中(包括source串结尾的'\0'字符),并且在destination串的结尾继续加上'\0'字符,直到拷贝的字符总个数等于num为止。


[例]

设有如下声明,注意此时source串的长度为6(包含最后的'\0'字符):

char destination[] = "********************"; // destination串为: "********************0"
cosnt char *source = "-----";                // source串为:      "-----0"

情形1:如果执行如下语句:

strncpy( destination, source, 5 );

那么destination的前5个字符将会被'-'替换,即(以'0'表示'\0'字符):

destination串为: "-----***************0"

情形2:如果执行如下语句:

strncpy( destination, source, 6 );

那么destination的前6个字符将会被source的前6个字符替换,即(以'0'表示'\0'字符):

destination串为: "-----0**************0"

情形3:如果执行如下语句:
strncpy( destination, source, 10 );

那么destination的前6个字符将会被source的前6个字符替换,并且会在后面补4个'\0',即(以'0'表示'\0'字符):

destination串为: "-----00000**********0"

snprintf函数:
用于将格式化的数据写入字符串,其原型为:
    int snprintf(char *str, int n, char * format [, argument, ...]);

【参数】str为要写入的字符串;n为要写入的字符的最大数目,超过n会被截断;format为格式化字符串,与printf()函数相同;argument为变量。

【返回值】成功则返回参数str 字符串长度,失败则返回-1,错误原因存于errno 中。

snprintf()可以认为是sprintf()的升级版,比sprintf()多了一个参数,能够控制要写入的字符串的长度,更加安全,只要稍加留意,不会造成缓冲区的溢出。

snprintf()与sprintf()使用方法类似,请参考:C语言sprintf()函数

注意:snprintf()并不是标C中规定的函数,但是在许多编译器中,厂商提供了其实现的版本。

在GCC中,该函数名称就snprintf(),而在VC中称为_snprintf()。由于不是标准函数,没有一个统一的标准来规定该函数的行为,所以导致了各厂商间的实现版本可能会有差异。

差异发生在参数 n。在GCC中,参数n是要向str写入3个字符,包括'\0'字符;在VC中,参数n是要写入的字符串的总字符数。

在GCC中运行如下程序:
 
        
  1. #include <stdio.h>
  2. int main()
  3. {
  4. char str[5];
  5. int ret = snprintf(str,3,"%s","abcdefg");
  6. printf("%d\n",ret);
  7. printf("%s",str);
  8. return0;
  9. }
输出:
7
ab

在VC中运行如下程序:
 
        
  1. #include <stdio.h>
  2. int main()
  3. {
  4. char str[5];
  5. int ret = _snprintf(str,3,"%s","abcdefg");
  6. printf("%d\n",ret);
  7. printf("%s",str);
  8. return0;
  9. }
输出:
-1
abc

从输出结果可以知道:
  • GCC中的参数n表示向str中写入n个字符,包括'\0'字符,并且返回实际的字符串长度。
  • VC中的参数n表示会向str中写入n个字符,不包括'\0'字符,并且不会在字符串末尾添加'\0'符。当字符串长度超过参数n时,函数返回-1,以表示可能导致错误。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值