c语言中单引号和双引号的区别(顺利解决从字符串中提取IP地址的困惑)

 更新时间:2013年07月25日 09:42:05   作者:  
c语言中的单引号和双引号可是有很大区别的,使用之前一定要了解他们之间到底有什么不同,下面小编就给大家详细的介绍一下吧,对此还不是很了解的朋友可以过来参考下

问题:
从c++文件中将std:string转换为char*后,返回包含IP地址的char*,需要将该字符串char*中的IP地址提取出来;

解决办法:
1. 解决思路:
IP地址最长为12字符+3句点=15字符,一般性表示为192.168.111.111;
可以从第一个字符开始解析,当不是'.'时,将所有字符保存下来,然后把所有保存下来的字符转换为16进制就可以了;

2. 程序如下:

复制代码 代码如下:

typedef struct {
    char addr_ipv4[4];
} IPADDR_IPV4;
#include <stdlib.h>
// Function: To extract HEX value of IP address from string expression.
IPADDR_IPV4 parse_IPString(const char *str, u8 strlen) {
 IPADDR_IPV4 ipv4;
 char tmpBuf[4] = {0};
 u8 k;
 u8 inx = 0;
 u8 j = 0;
 // Dprintf("The ch_ip is:%s\n", ch_ip);
 for (k=0; k<strlen; k++) {
  if (str[k] != '.') {
   // Dprintf("k-inx: %d\n", k-inx);
   memcpy(&tmpBuf[k-inx], &str[k], 1);
  }
  else {
   inx = k + 1;
   // Dprintf("inx: %d, tmpBuf: %s\n", inx, tmpBuf);
   ipv4.addr_ipv4[j++] = strtol(tmpBuf, NULL, 10);
   memset(tmpBuf, 0, sizeof(tmpBuf));
   continue;
  }
  // Dprintf("tmpBuf: %s\n", tmpBuf);
  ipv4.addr_ipv4[j] = strtol(tmpBuf, NULL, 10);
 }
 // Dprintf("ipv4 is: ");
 // for (k=0; k<sizeof(ipv4.addr_ipv4); k++) {
 //  Dprintf("%d", ipv4.addr_ipv4[k]);
 // }
 // Dprintf("\n");
 return ipv4;
}

应用如下:
复制代码 代码如下:

   char* ch_ip = NULL;
    IPADDR_IPV4 ipv4Addr;
    ch_ip = (char*)malloc(16);
    memset(ch_ip, 0, 16);

    // parse IP address
    ch_ip = getIPAddr();

    // convert IP address from string to HEX expression
    ipv4Addr = parse_IPString(ch_ip, strlen(ch_ip));

3. 注意事项:
原来进行字符比较的时候,用的是if (str[k] != ".")而不是if (str[k] != '.'),结果一直不对。
后来反复 查找原因,才知道单引号''和双引号“”的区别:

(1)。含义不同。
单引号引起的一个字符代表一个整数,整数值对应于该字符在ASCII字符集中的序列值;
双引号引起的都是字符串,哪怕只有一个字符也是字符串,双引号引起的一个字符代表一个指向无名数组起始字符的指针;
比如:'.'代表十进制46,十六进制0x2E;
而"."代表指向起始字符为"."的某数组的指针;

(2)。大小不同。
单引号引起的一个字符大小就是一个字节;
双引号引起的一个字符大小是两个字节,因为双引号引起的字符串会在字符串的末尾添加一个0x00作为字符串的结束标识。

在本人的程序中正确取到了IP地址。
问题解决。

相关文章

  • C++实现LeetCode(49.群组错位词)

    C++实现LeetCode(49.群组错位词)

    这篇文章主要介绍了C++实现LeetCode(49.群组错位词),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • Linux c中define的用法小结

    Linux c中define的用法小结

    学习了这么多年C语言,说实话对宏自以为了如指掌了,没想到看内核代码的时候还是那么吃力,设备驱动代码中有很多这样或者那样的宏定义,各种define,在学习的过程中将C语言中所出现的#define定义整理总结了一下,供大家借鉴和学习。
    2016-01-01
  • QT通过C++线程池运行Lambda自定义函数流程详解

    QT通过C++线程池运行Lambda自定义函数流程详解

    最近在接触公司的一个QT桌面项目,其中里面有一个模块是使用线程池去运行自定义函数的,自己潜心研究那个线程池代码一天,发现研究不透,看不懂,里面几乎都是使用C++11的新特性进行编写
    2022-10-10
  • 基于C语言实现泛型编程详解

    基于C语言实现泛型编程详解

    对于C而言,想实现泛型编程并非易事,甚至可以说非常繁琐,一大堆坑。最主要也没有现成的轮子可用。本文就来详细为大家讲讲C语言如何实现泛型编程详解,需要的可以参考一下
    2022-07-07
  • C++如何切割String对象的方法

    C++如何切割String对象的方法

    C++相较于Java,Python 并没有提供的字符串分割的函数split,因此需要自己进行编写,本文主要介绍了C++如何切割String对象的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • Qt之实现圆形进度条的示例代码

    Qt之实现圆形进度条的示例代码

    在平时做页面开发时,有些时候会用到圆形进度条,本文主要介绍了Qt之实现圆形进度条的示例代码,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • 如何用C++实现双向循环链表

    如何用C++实现双向循环链表

    本篇文章是对用C++实现双向循环链表的方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C++虚函数表和虚析构介绍

    C++虚函数表和虚析构介绍

    这篇文章主要介绍了C++虚函数表和虚析构,虚函数表是C++实现多态的基础,多态是面向对象的三大特性之一,下面文章我们一起来看看详细内容,需要的朋友可以参考一下
    2021-11-11
  • C++实现迷宫游戏

    C++实现迷宫游戏

    这篇文章主要为大家详细介绍了C++实现迷宫游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • C语言关键字之auto register详解

    C语言关键字之auto register详解

    这篇文章主要为大家介绍了C语言关键字之auto register,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01

最新评论