gets

  1. 参数是个字符数组
  2. char * gets(char *s);

使用gets和scanf都要注意缓冲区溢出问题
返回值

  • 成功: 读取的字符串
  • 失败: NULL

    int main(int argc, char const *argv[])
    {
      char a[100]={ 0 };
      gets(a);
      printf("%s\n", a);
      return 0;
    }
    

    运行会有个警告,先不用管

  • scanf认为回车和空格都代表输入完成,不允许含有空格

  • gets认为回车代表输入完成,空格只是字符串一部分

    fgets

    char *fgets(char *s, int size, FILE *stream);
    
  • 从stream指定的文件内读入字符,保存到指定的内存空间,直到出现换行字符,读到文件结尾或是已经读了size-1个字符为止,最后自动加上字符'\0'作为字符串结束

  • fgets有三个参数,第一个参数是char的数组,第二个参数是标明这个数组的大小,第三个参数如果是通过键盘输入可以固定写为stdin
  • 结果: 如果输入的大小小于原始指针对应区域的大小,会在字符串输入完成时自动加上\n\0.如果输入的大小小于等于原始指针对应的区域大小,会自动加上\0,而不会在加上\n

gets函数不检查预留缓冲区是否能够容纳用户实际输入的数据.多出来的字符会导致内存溢出,fgets解决了这个问题
由于fgets函数是为读取文件设计的,所以读取键盘输入的时候没有gets方便

int main(int argc, char const *argv[])
{
    char a[10]={ 0 };
    fgets(a,sizeof(a),stdin);
    printf("%s", a);
    return 0;
}

fgets会认为用户输入的回车也是字符串的一部分

puts

#include <stdio.h>
int puts(const char *s);

返回值

  • 成功: 非负数
  • 失败: -1

puts函数打印字符串,与printf不同,puts会在最后自动添加一个’\n’,puts不支持各种转义字符,比如%d,%s都不支持,puts只能简单的直接输出一个字符串,而不能输出char,int,double等其他类型

char s[]="hello world";
puts(s);

fputs

int fputs(const char * str, FILE * stream);

fputs是puts的文件操作版本
第一个参数是一个char的数组,第二个参数如果只是用puts在屏幕输出的话可以固定写为stdout
返回值

  • 成功: 0
  • 失败: -1

    char s[]="hello world";
    fputs(s,stdout);
    

    strlen

    字符串长度
    这个库函数需要包含头文件

    size_t strlen(const char * _Str);
    

    返回不包含字符串结尾’\0’的字符串长度
    建议不要处理字符数组,除非含有’\0’
    我们自己算长度

    char a[100]="hello";
    unsigned int len=0;
    while(a[len])
    {
      len++;
    }
    printf("%u\n", len);
    
    #include <stdio.h>
    #include <string.h>
    int main(int argc, char const *argv[])
    {
      char a[100]="hello world";
      unsigned int len=0;
      len=strlen(a);
      printf("%u\n", len);
      return 0;
    }
    

    strcat

    字符串追加

    size_t strcat(char * _Str1, const char * _Str2);
    

    将参数_Str2追加到_Str1后尾,’\0’也会追加过去
    返回

  • 成功: 返回dest字符串的首地址

  • 失败: NULL

    char a[100]="abc";
    char b[100]="123";
    //把a和b合并为一个字符串,结果放入a
    strcat(a,b);
    printf("%s\n", a);
    

    要小写,a的长度和b的长度,不然会内存溢出

    stncat,字符串有限追加

    size_t strncat(char * _Str1,const char * _Str2,size_t len);
    

    在strcat基础上增加了一个参数,这个参数来标明最多可以追加几个char

    strcmp 字符串比较

    int strcmp(const char * _Str1, const char * _Str2);
    

    比较的是字符ASCII码大小
    返回
    相等返回0,
    大于:>0,
    小于:<0

    strncmp 字符串有限比较

    指定比较2个字符串的前几个字符

    int strncmp(const char * _Str1, const char * _Str2,size_t n);
    

    n代表指定比较字符串的数量

    strcpy 字符串拷贝

    char *strcpy(char *_Str1, comst char *_Str2);
    

    将参数_Str2拷贝到参数_Str1中,’\0’也会拷贝过去
    Strcpy也存在内存溢出的问题
    返回

  • 成功: 返回dest字符串的首地址

  • 失败: NULL

    strncpy 字符串有限拷贝

    char *strncpy(char *_Str1, comst char *_Str2,size n);
    
    n代表有限拷贝,一般n为size(char *_Str1)-1

    sprintf 格式化字符串

    和printf函数功能类似,printf函数将格式化结果输出到屏幕,sprintf将格式化结果输出到字符串
    #include <stdio.h>
    int sprintf(char *str, const char *format, ...);
    功能:
      根据参数format字符串来转换并格式化数据,然后将结果输出到str指定的空间中,直到出现字符串结束符'\0'为止
    参数:
      str:字符串首地址
      format:字符串格式,用法和printf()一样
    返回值:
      成功: 实际格式化的字符个数
      失败: -1
    
    sprint使用方法和printf类似,唯一区别是增加了第一个参数,第一个参数是一个char数组
    char a[100];
    sprintf(a,"%s","hello world");
    printf("%s\n", a);
    

    sscanf函数

    sscanf类似scanf函数,scanf从键盘读取用户输入,scanf从指定格式化字符串读取输入
    sscanf多了第一个参数,char数组,sscanf会从这个char数组中读取相关内容
    #include <stdio.h>
    int sscanf(const char *str, const char *format, ...);
    功能:
      从str指定的字符串读取数据,并根据参数format字符串来转换并格式化数据
    参数:
      str: 指定的字符串首地址
      format: 字符串格式,用法和scanf()一样
    返回值:
      成功: 实际读取的字符个数
      失败: -1
    

image.png

strchr 查找字符

char * strchr(char * _Str,int _Ch);

在参数_str中查找_Ch指定字符,找到返回字符_Ch在_Str中所在位置,没有找到返回NULL;

int main()
{
    char src[] = "dda123sdf";
    char *p = strchr(src, 'a');    //如果是汉子用""
    printf("p=%s\n", p);  //a123sdf
    if (p != NULL)
    {
        printf("找到了\n");
    }

    system("pause");
    return EXIT_SUCCESS;
}

strstr查找字符串

int main()
{
    char src[] = "dda123sdf";
    char *p = strstr(src, "a123");
    printf("p=%s\n", p);    //a123sdf

    system("pause");
    return EXIT_SUCCESS;
}

失败返回NULL

strtok 字符串分割

#include<string.h>
char *strtok(char *str, const char *delim);

功能: 将字符串分割成一个个片段,当strtok()在参数s的字符串中发现参数delim中包含的分割字符时,则会将该字符改为’\0’字符,当连续出现多个时只替换第一个为’\0’

int main()
{
    char src[] = "dda123sdf";
    char *p = strtok(src, "a123");
    printf("p=%s\n", p);    //dd

    system("pause");
    return EXIT_SUCCESS;
}

scanf

int main()
{
    char arr[100];
    int a, b, c;
    //1. 接收换行结束,可以接收空格
    //scanf("%[^\n]", &arr);
    //printf("%s\n", arr);
    //2. 在scanf获取数据时,建议不要添加任何字符,空格除外
    //scanf("a=%db=%dc=%d", &a, &b, &c); //输入a=1b=2c=3
    //printf("%d %d %d\n", a, b, c);
    //3. 有限定字符宽度的格式化
    //scanf("%1d%2d%3d", &a, &b, &c);
    //printf("%.2f\n", 3.1415);
    //printf("%d %d %d\n", a, b, c);
    //补空格
    //printf("%4s\n", "ab");
    //截取
    //printf("%.4s\n", "ab");
    //4. 屏蔽数据类型, %d屏蔽数字, %c屏蔽字符
    //scanf("%*d%s", arr);
    //printf("%s\n", arr);
    //5. 屏蔽一个区间之内的
    //scanf("%*[a-z]%c", arr);
    //printf("%s\n", arr);
    system("pause");
    return EXIT_SUCCESS;
}

aoti

头文件:#include <stdlib.h>

atoi() 函数用来将字符串转换成整数(int),其原型为:
int atoi (const char * str);

atoi() 函数会扫描参数 str 字符串,
跳过前面的空白字符(例如空格,tab缩进等,可以通过 isspace() 函数来检测),
直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时('\0')才结束转换,并将结果返回。

返回转换后的整型数;如果 str 不能转换成 int 或者 str 为空字符串,那么将返回 0

将字符串a 与字符串b 转换成数字后相加

#include <stdio.h>
#include <stdlib.h>
int main ()
{
    int i;
    char buffer[256];
    printf ("Enter a number: ");
    fgets (buffer, 256, stdin);
    i = atoi (buffer);
    printf ("The value entered is %d.", i);
    system("pause");
    return 0;
}

输出

Enter a number: 233cyuyan
The value entered is 233.