Linux C编程学习6---字符串处理、数据转换

1.字符串
  应用程序按其功能可分为数值计算、非数值计算以及输入输出操作等。非数值计算程序占相当大的比例,其核心就是字符串处理
  1.1.字符测试
    1.1.1.测试字符是否为英文字母
      int isalpha(int c)。若c为英文字母,则返回非零值,否则返回值为0
    1.1.2.测试字符是否为数字
      int isdigit(int c)。若c为数字,则返回非零值,否则返回值为0
  1.2.字符串初始化
    在C语言中,字符串被当做字符数组来处理,对应于内存中的一块连续的区域
    可以使用 void *memset(void *buffer, int c, int count)来对这块连续的内存初始化
      buffer是指针,指向我们要初始化的连续内存的首地址
      参数c,是用来说明将这块内存都初始化为哪个字符,若c为0的话,就是将这块内存清零
      参数count,设置的内存的字节数
    例子

#include<stdio.h>
#include<string.h>
int main()
{
char s[]="hello world";
printf("%s\n", s);
memset(s, ‘H‘, 5);
printf("%s\n", s);
return 0;
}

    输出结果是:

      hello world
      HHHHH world
  1.3.字符串的复制
    1.3.1. char *strcpy(char *dest, char *src)
      将src指向的字符串,复制给dest所指向的内存。
      注意:这两个参数所指向的内存区域是不允许重叠的
      函数的返回值是指向 dest的指针
    1.3.2. char *strdup(char *s)
      函数的返回值是指向被复制的字符串的指针,所指向的内存区域是系统自动分配的
    1.3.3. void *memcpy(void *dest, void *src, unsigned int count)
      将参数src所指向的内存区域复制count个字节到dest所指向的内存区域
      这两个指针所指向的内存区域也是不可以重叠的
      函数的返回值是指向 dest的指针
      和strcpy 的不同之处在于:memcpy给源内存和目标内存的指针之后,复制指定大小(unsigned int count)的内存,而不检查内存中的具体内容,包括字符串的结束符,而前面的strcpy 函数是一旦遇到字符串的结束符则立即停止复制
      所以 memcpy并没有将参数当做字符串来看待
    1.3.4. void *memmove(void *dest, const void *src, size_t n)
      将参数src所指向的内存区域复制n 个字节到dest所指向的内存区域
      和strcpy、memcpy不同的是这两个指针所指向的内存区域是可以重叠的
      例子

#include<stdio.h>
#include<string.h>
int main()
{
char s[] = "Linux C Programming";
printf("%s\n", s);
memmove(s, s+6, strlen(s)-6);
s[strlen(s)-6] = ‘\0‘;
printf("%s\n", s);
return 0;
}

      输出结果是

        Linux C Programming
        C Programming
  1.4.字符串的比较
    1.4.1. int strcmp(const char *s1, const char *s2)
      比较参数s1 和 s2所指向的字符串,比较的依据是字符的ASCII码的值,首先将s1的第一个字符减去s2 的第一个字符,如果相同则继续比较第二个字符,如此往后比较。如果字符串相同,则返回值为0,如果不相同,则返回不相同出的字符的ASCII码的差值
    1.4.2. int strncmp(const char *s1, const char * s2, size_t n)
      比较s1 和s2 所指向的字符串的前 n个字节
    1.4.3. int strcasecmp(const char *s1, const char *s2)
      类似于 strcmp,但是在比较的过程中是忽略大小写的
    1.4.4. int strncasecmp(const char *s1, const char *s2, size_t n);
      类似于 strncmp,但是在比较的过程中是忽略大小写的
    1.4.5. int memcmp(const void *s1, const void *s2, size_t n)
      比较s1 和s2 所指向的内存空间的前 n个字节,但是它在比较时候,并不是将 s1 和s2 当做字符串的,并不会考虑内存区域中的字符串结束符
  1.5.字符/字符串查找
    1.5.1. char *index(const char *s, int c)
      在参数s1 做指向的字符串中,从前往后查找字符c,如果找到c 第一次出现的位置,就返回指向这个位置的指针,如果找不到这个字符,就返回 null
      例子

#include<stdio.h>
#include<string.h>
int main()
{
char s[] = "hello world";
char *p;
p = index(s, ‘w‘);
printf("%s\n", p);
return 0;
}

      输出结果是

        world
    1.5.2. char *rindex(const char *s, int c)
      和 index 类似,不过是从后往前查找
    1.5.3. char *strchr(const char *s, int c)
      和 index 类似,但是不能查找 ‘\0‘这个字符。可以用 index(s, ‘\0‘)的形式,但是不能用 strchr(s, ‘\0‘)
    1.5.4. char strrctr(const char *s, int c)
      和 rindex 类似,但是不能查找 ‘\0‘这个字符。可以用 rindex(s, ‘\0‘)的形式,但是不能用 strrchr(s, ‘\0‘)
    1.5.5. char *strstr(const char *haystack, const char *needle)
      在字符串haystack中查找字符串needle,并返回第一次出现的位置,如果没有找到就返回一个空指针
  1.6.字符串连接分割
    1.6.1. char *strcat(char *dest, const char *src)
      将 src所指向的字符串连接到 dest所指向的字符串,返回目标指针的起始地址
      注意,目标字符串必须有足够的缓冲区,否则会发生溢出
      例子

#include<stdio.h>
#include<string.h>
#define BUFFER_SIZE 64
int main()
{
char s[BUFFER_SIZE] = "orld;
char d[BUFFER_SIZE] = "hello w";
strcat(d, s);
printf("%s\n", s);
printf("%s\n", d);
return 0;
}

      输出结果是

        orld
        hello world
    1.6.2. char *strncat(char *dest, const char *src, size_t n)
      从src 取出n 个字节,连接到dest 所指向的字符串。
      如果src的前n 个字节中没有出现‘\0‘,那么会在结尾处自动添加一个‘\0‘
    1.6.3. char *strtok(char *str, const char *delim)
      将 str字符串使用 delim这个分割符号来进行分割。如果在字符串str 找到任何一个分隔符则将其更改为字符串的结束符
      例子

#include<strio.h>
#include<string.h>
int main()
{
char str[] = "Linux C Programming";
char *p;
p = strtok(str, " ");
while(p != NULL)
{
printf("%s\n", p);
p = strtok(NULL, " ");
}
printf("str : "%s\n", str);
return 0;
}

      输出结果是

        C
        Programming
        str : Linux

2.数据转换
  数据转换包括英文字母大小写之间的转换、字符串与整数、浮点数之间的转换
  2.1.字母大小写转换
    int toupper(int c) 将小写英文字母转换为大写,如果 c是小写字母则返回对应的大写字母,否则返回原来的值
    int tolower(int c) 将大写英文字母转换为小写,原理类似上面的那个
  2.2.字符串转换
    实现字符串与整数、浮点数之间转换
    2.2.1. 将字符串转换为整数
      int atoi(const char *nptr)
      long atol(const char * nptr)
        这两个函数首先对字符串进行扫描,直到出现数字或者正负号才开始转换,然后再出现非数字或者字符串结束符就停止转换并将结果返回
        只能转换10进制的字符串
        例子

#include<stdio.h>
#include<string.h>
int main()
{
char a[] = "-100";
char b[] = "0x20";
int c;
c = atoi(a) + atoi(b);
printf("c = %d\n", c);
return 0;
}

  

输出结果是
-100
因为,将a转换为 -100,而b是0x20,转换时,先将0转换为0,遇到x就停止转换
2.2.2. 将字符串转换为浮点数
double atof(const char *nptr)
函数首先对字符串进行扫描,直到出现数字或者正负号才开始转换,然后再出现非数字或者字符串结束符就停止转换并将结果返回
这个函数中,字符串可以包含+、-、小数点、E、e(E、e表示浮点数的指数部分)
2.2.3. 将浮点数转换为字符串
char *gcvt(double number, size_t ndigits, char *buf)
第一个参数是要转换的浮点数
第二个参数是要显示的位数
第三个参数是用来存放最终结果的一个缓冲区

时间: 2024-08-16 14:17:50

Linux C编程学习6---字符串处理、数据转换的相关文章

linux网络编程学习笔记之二 -----错误异常处理和各种碎碎(更新中)

errno 在unix系统中对大部分系统调用非正常返回时,通常返回值为-1,并设置全局变量errno(errno.h),如socket(), bind(), accept(), listen().erron存放一个正整数来保存上次出错的错误值. 对线程而言,每个线程都有专用的errno变量,不必考虑同步问题. strerror converts to English (Note: use strerror_r for thread safety) perror is simplified str

linux网络编程学习笔记之六 -----I/O多路复用服务端

多进程和多线程的目的是在于最大限度地利用CPU资源,当某个进程不需要占用太多CPU资源,而是需要I/O资源时,可以采用I/O多路复用,基本思路是让内核把进程挂起,直到有I/O事件发生时,再把控制返回给程序.这种事件驱动模型的高效之处在于,省去了进程和线程上下文切换的开销.整个程序运行在单一的进程上下文中,所有的逻辑流共享整个进程的地址空间.缺点是,编码复杂,而且随着每个逻辑流并发粒度的减小,编码复杂度会继续上升. I/O多路复用典型应用场合(摘自UNP6.1) select的模型就是这样一个实现

Linux C编程学习5---参考《那年,一步一步学linux c》全系列(目录索引)

漫无目的的搜索一些东西,发现的一个很好的资源,所以就一定要收藏下来,方便自己学习Linux C 的时候也能够去参考一下别人的学习之路,来更加促进我的学习和思考 说明 转载请注明出处:谢谢:http://blog.csdn.net/muge0913/article/details/7342977 博主的邮箱是:[email protected] 文章中若有不对或某些功能更好的实现方法,请指出或直接留言. 该系列文章中所用结构数据代码均来自linux2.6.39. 1.那年,一步一步学linux c

linux网络编程学习笔记之五 -----并发机制与线程?

进程线程分配方式 简述下常见的进程和线程分配方式:(好吧,我仅仅是举几个样例作为笔记...并发的水太深了,不敢妄谈...) 1.进程线程预分配 简言之,当I/O开销大于计算开销且并发量较大时,为了节省每次都要创建和销毁进程和线程的开销.能够在请求到达前预先进行分配. 2.进程线程延迟分配 预分配节省了处理时的负担,但操作系统管理这些进程线程也会带来一定的开销.由此,有个折中的方法是,当某个处理须要花费较长时间的时候,我们创建一个并发的进程或线程来处理该请求.实现也非常easy,在主线程中定时,定

Linux C编程学习2---GCC编译器

GCC简介 GCC(GNU Compiler Collection)是一套功能强大.性能优越的编程语言编译器,它是GNU计划的代表作品之一.GCC以GPL和LGPL许可证发行,它是类Unix和苹果电脑 Mac OS X操作系统的标准编译器 除了支持C,还支持C++.Java GCC常用选项 1. 基本选项 类型 说明 -E 预处理后即停止,不进行编译.汇编及连接 -S 编译后即停止,不进行汇编及连接 -c 编译或汇编源文件,但是不进行连接 -o file 指定输出文件为 file 例子: gcc

linux网络编程学习笔记之四 -----多线程并发服务端

相对于使用进程实现并发,用线程的实现更加轻量.每个线程都是独立的逻辑流.线程是CPU上独立调度运行的最小单位,而进程是资源分配的单位.当然这是在微内核的操作系统上说的,简言之这种操作系统的内核是只提供最基本的OS服务,更多参看点击打开链接 每个线程有它自己的线程上下文,包括一个唯一的线程ID(linux上实现为unsigned long),栈,栈指针,程序计数器.通用目的寄存器和条件码,还有自己的信号掩码和优先级.同一个进程里的线程共享这个进程的整个虚拟地址空间,包括可执行的程序文本.程序的全局

linux网络编程学习笔记之五 -----并发机制与线程池

进程线程分配方式 简述下常见的进程和线程分配方式:(好吧,我只是举几个例子作为笔记...并发的水太深了,不敢妄谈...) 1.进程线程预分配 简言之,当I/O开销大于计算开销且并发量较大时,为了节省每次都要创建和销毁进程和线程的开销.可以在请求到达前预先进行分配. 2.进程线程延迟分配 预分配节省了处理时的负担,但操作系统管理这些进程线程也会带来一定的开销.由此,有个折中的方法是,当某个处理需要花费较长时间的时候,我们创建一个并发的进程或线程来处理该请求.实现也很简单,在主线程中定时,定时到期,

Linux下编程学习一

本篇主要记录一些在学习LINUX下编程时,, C和C++语言的一些基础的常识, 一. 函数指针 void MyFun(int x); 函数声明 void (*FunP)(int ); 函数指针声明 下面是C和C++中的指针定义  int (*pt2Function)(float, char, char) = NULL; // C普通函数指针 int (TMyClass::*pt2Member)(float, char, char) = NULL; // C++中指向静态函数的指针 int (TM

Linux 3D 编程学习总结

Linux下应用OGRE开发3D linux下应用OGRE开发3D的资料网上很少,今天抽空整理一下. 大部分内容参考OGRE主页http://www.ogre3d.org/. 首先根据主页提示,我们可以利用已有资源构建一个工程,具体步骤如下: 第一步,准备工作,确定你是在linux环境下,进入终端,输入一下命令: 编译和配置 sudo apt-get install build-essential automake libtool 需要的依赖 sudo apt-get install libfr