C++ 在c_str()、length()和size()之间发现不一致

C++ 在c_str()、length()和size()之间发现不一致,c++,string,null,unordered-map,c-strings,C++,String,Null,Unordered Map,C Strings,我正在使用std::unordered\u map数据结构,使用pair从文本文件构建一个映射。 BaseDevice是一种结构,包含64位id和字符串: struct BaseDevice { public: uint64_t id; string ipAddress; } 我读取了一个文件(假设它写得正确),并按照如下方式构建地图: char buffer[1024]; ifstream fin(myfile.c_str()); while(fin.eof() == fa

我正在使用std::unordered\u map数据结构,使用pair从文本文件构建一个映射。 BaseDevice是一种结构,包含64位id和字符串:

struct BaseDevice
{
public:
    uint64_t id;
    string ipAddress;
}
我读取了一个文件(假设它写得正确),并按照如下方式构建地图:

char buffer[1024];
ifstream fin(myfile.c_str());

while(fin.eof() == false)
{
  fin.getline(buffer, 1023);
  StringTokenizer st(buffer, " ");

  //Parse ID and address
  unsigned int id = atoi(st.nextToken().c_str()); //get ID
  string ipAddress = st.nextToken();  //get IP address

  //Create the local structure and add to the map
  BaseDevice dev;
  dev.id = id;
  dev.ipAddress = ipAddress;
  myMap[id] = dev;

  break;
}
奇怪的是,当我遍历映射时,ipAddress字符串似乎是(null),而length()和size()都不是

无序映射::常量迭代器itr1;
对于(itr1=myMap.begin();itr1!=myMap.end();itr1++)
{
const BaseDevice&device=itr1->second;
fprintf(标准输出,“id%lu IP地址%s\n”,myMap->first,device.ipAddress);
printf(“长度为%d\n”,device.ipAddress.Length());
printf(“大小为%d\n”,device.ipAddress.Size());
/*
输出:
id 2 IP地址(空)
长度是8
尺码是8号
*/
}

我想问你:这怎么可能?我做错什么了吗?谢谢。

您正在打印
设备。ipAddress
就好像它是一个C字符串(带有
%s
格式说明符),这是不正确的,因此
fprintf
在打印时可能会发疯。你应该做:

fprintf(stdout, "...%s...", device.ipAddress.c_str());
您也可以使用
std::cout

std::cout << device.ipAddress << '\n';

std::cout您正在打印
device.ipAddress
就像它是一个C字符串(带有
%s
格式说明符),这是不正确的,因此
fprintf
在打印时可能会发疯。你应该做:

fprintf(stdout, "...%s...", device.ipAddress.c_str());
您也可以使用
std::cout

std::cout << device.ipAddress << '\n';

std::cout
fprintf()
如果格式说明符与相应参数的类型不一致,则给出未定义的行为<代码>%s
采用C样式字符串(表示为字符数组,以零值结尾)。
std::string
不是C样式的字符串。为什么在某些代码中使用C++ IoSokes,而在其他代码中使用<代码> fPrtff()?这是造成混乱的主要原因。
eof()
适用于您的循环。相反,您应该确保
getline
成功,而不是盲目地假设它成功。还请注意,所有主要编译器当前都会对不匹配的
printf
类型发出警告。打开你的编译器警告。@Peter,你是对的,我混合了一些东西。我习惯C语法,对C++环境非常陌生。@克里斯,我想我会改变循环条件。<代码> fPrtff()/Cuth>如果格式说明符与相应的参数类型不一致,则会给出未定义的行为。代码>%s
采用C样式字符串(表示为字符数组,以零值结尾)。
std::string
不是C样式的字符串。为什么在某些代码中使用C++ IoSokes,而在其他代码中使用<代码> fPrtff()?这是造成混乱的主要原因。
eof()
适用于您的循环。相反,您应该确保
getline
成功,而不是盲目地假设它成功。还请注意,所有主要编译器当前都会对不匹配的
printf
类型发出警告。打开你的编译器警告。@Peter,你是对的,我混合了一些东西。我习惯C语法,对C++环境非常陌生。@克里斯,我想我会改变循环条件。