C语言笔记5

admin 2025年3月8日03:20:56评论5 views字数 5539阅读18分27秒阅读模式
输出函数
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

函数
  • 函数内部,包括()内部的形参变量,只有在调用时分配空间,调用完毕自动释放;

  • returnexit()函数区别,只要一调用 exit()函数(不管在什么地方),整个程序就结束,但是只有在main函数中调用return才会结束程序;

  • 声明函数加不加 extern关键字都一样,  声明函数可以不指定形参名称,只指定形参形参类型,但是定义不可以。

  • 头文件一般是放函数声明;

  • 多个文件中(同一项目),不能出现同名函数(static除外)。这就是为什么 .h文件只放函数的声明,不放函数的定义;

  • 防止头文件重复包含: 当一个项目比较大时,往往都是分文件,这时候有可能不小心把同一个头文件 include 多次,或者头文件嵌套包含。

防止办法:

#ifndef 方式;

#ifndef __SOMEFILE_H__

#define __SOMEFILE_H__



// 声明语句



#endif

#pragma once 方式。


原文始发于微信公众号(泷羽sec-心安):C语言笔记5

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年3月8日03:20:56
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   C语言笔记5https://cn-sec.com/archives/3813990.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息