VS2008 C++中 inet_addr()函数用法。 inet_addr: 不能将参数 1 从“CString”转换为“const char *”

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VS2008 C++中 inet_addr()函数用法。 inet_addr: 不能将参数 1 从“CString”转换为“const char *”相关的知识,希望对你有一定的参考价值。

有如下定义
CEdit m_Address;
CString address;
int IpAddress;
想取出编辑框中输入的ip地址并进行分析
m_Address.GetWindowTextW(address);
IpAddress=inet_addr(address);
可是上一句出错了,说error C2664: “inet_addr”: 不能将参数 1 从“CString”转换为“const char *”
IpAddress=inet_addr((LPCTSTR)address);
还是不行
“inet_addr”: 不能将参数 1 从“LPCTSTR”转换为“const char *”

1、string 转 CString

CString.format("%s", string.c_str());

2、char * 转 CString

CString.format("%s", char*);

3、char * 转 string

string s(char *);

4、string 转 char *

char *p = string.c_str();

5、CString 转 string

string s(CString.GetBuffer(CString.GetLength()));

6、CString 转 char *

charpoint=strtest.GetBuffer(strtest.GetLength());

不建议用(LPCTSTR)进行强制类型转化,这样strtest大小发生变化时会出现错误。

7、CString 转 char[100]

char a[100];

CString str("aaaaaa");

strncpy(a,(LPCTSTR)str,sizeof(a));
参考技术A IpAddress=inet_addr((LPCTSTR)address);
强制转换一下试试看。
参考技术B address.getSysString()

VS2017社区中的C++程序崩溃

【中文标题】VS2017社区中的C++程序崩溃【英文标题】:C++ program crash in VS2017 Community 【发布时间】:2018-04-07 12:48:31 【问题描述】:

我尝试编写简单的类。但一开始遇到问题。 当我编写构造函数、1 个析构函数和 1 个显示类方法并在主函数中调用它时,我遇到了意外错误。最有趣的是,在调试模式下,在 VS2017 社区中,在不同的地方抛出了错误:一次在构造函数中,另一个在 show 方法中,最重要的是在 main 函数中返回 0 之后。 那是我的 main.cpp

#include "MyScreen.h"

int main()

    MyScreen scr = MyScreen(10, 10);
    scr.show();
    char ch;
    std::cin >> ch;
    return 0;

有我的 MyScreen 类的头文件

#pragma once
#include <iostream>
using std::cout;
class MyScreen

public:
    MyScreen();
    MyScreen(int, int, char pc = _filler);
    ~MyScreen();

    void show();
private:
    static const int maxHeight;
    static const int maxWidth;
    static const char _filler;
    int _height;
    int _width;
    char *_wContent;
    int _cursor;
;

还有cpp文件

#include "MyScreen.h"

const int  MyScreen::maxHeight = 28;
const int  MyScreen::maxWidth  = 118;
const char MyScreen::_filler   = '#';

MyScreen::MyScreen()

    _height = maxHeight;
    _width = maxWidth;
    unsigned length = _height * _width;
    _wContent = new char(length);
    for (int i = 0; i < length; i++)
        _wContent[i] = _filler;
    _cursor = 0;


MyScreen::MyScreen(int height, int width, char pc)

    _height = height;
    _width = width;
    unsigned length = _height * _width;
    _wContent = new char(length);
    for (int i = 0; i < length; i++)
        _wContent[i] = pc;
    _cursor = 0;


MyScreen::~MyScreen()

    delete[] _wContent;
    _wContent = 0;


void MyScreen::show()

    for (int i = 0; i < _height; i++)
    
        for (int j = 0; j < _width; j++)
            cout << _wContent[i * 10 + j] << i * 10 + j;
        cout << '\n';
    

我得到了一些错误描述:

检测到严重错误 c0000374 ScreenClass.exe 已触发断点。 (xutility 文件)

抛出异常:读取访问冲突。 ptd 为 0x264FD5EC。 (fstream 文件)

调试错误! 检测到堆损坏:在 0x02ABC5A8 的正常块 (#152) 之后。 CTR 检测到应用程序在堆缓冲区结束后写入内存。

我不明白我做错了什么?我尝试在 DevC++ 中编译和运行此代码,它也抛出错误(返回 3221226356),但在该代码的第三次重新编译时它开始工作而没有错误!

这个问题属于VS2017吗?如果是,那么如何解决?

【问题讨论】:

应该是_wContent = new char[length];。照原样,您只为一个元素分配空间,随后越界读取导致未定义的行为。 @Ron 应该是std::vector&lt;char&gt;。 FTY @NemoUA 正如 cmets 中所指出的,您应该更喜欢 std::vector&lt;char&gt; 方法,因为应该避免这种原始指针操作。 DevC++ 接受new char(length),因为它是有效的 C++。但是将其视为数组会导致未定义的行为。看起来工作正常是未定义行为的有效表现。抛出指示堆损坏的错误也是未定义行为的有效表现。做其他事情也是。 @NemoUA - 尽管看起来非常相似,new char(value); 分配一个带有初始值的字符,而new char[length]; 分配一个字节序列。 【参考方案1】:

解决方案: 应该是方括号:

_wContent = new char[length];

而不是简单的括号,因为()分配空间并仅初始化1个值。但是在不同的 IDE 中可能会有不同的未定义行为(如在 DevC++ 中)。 强烈建议使用std::vector&lt;char&gt; 以避免可能导致未定义行为的指针操作。

非常感谢 Ron、Borgleader 和 Bo Persson 的帮助。

【讨论】:

以上是关于VS2008 C++中 inet_addr()函数用法。 inet_addr: 不能将参数 1 从“CString”转换为“const char *”的主要内容,如果未能解决你的问题,请参考以下文章

VS2008 中的 C++ 项目有效,但在 VS2010 中无效

将托管 C++ 从 vs2003 移植到 vs2008 的问题

vs2008中c++为啥代码没有智能提示

在将大型 C++ 程序从 VS2005 转换为 VS2008 之前我应该​​知道啥?

如何将 vs2008 c++ OpenCV dll 构建到 vs2008 C#?

VS C++ 2008:修改输出文本?