【问题标题】:SScanf for CString not working?CString 的 SScanf 不起作用?
【发布时间】:2014-08-28 15:06:52
【问题描述】:

我只想用字符“:”分割这个字符串 例如“第一个:最后一个” 所以一个字符串将具有“first”,另一个将具有“last”

我确实喜欢这个网址中的那个 (sscanf string splitting not working) 但这对我来说效果不佳,因为两个字符串都将具有“最后一个”值

 #define _CRT_SECURE_NO_WARNINGS  
 #include<iostream>
 #include <cstring>
 #include<tchar.h>
 #include<atlstr.h>
 using namespace std;


 void main()
{
    CString firstString(""), secondString(""), myString("first:last");

    sscanf(myString, "%[^:]:%s", firstString, secondString);

    printf("first: %s, last: %s", firstString, secondString);


    system("pause");

}

【问题讨论】:

  • 不能像 C io 输入函数那样直接使用 MFC 字符串。那些需要字符缓冲区。
  • 这应该如何工作? sscanf() 是一个 C 函数,它将填充字符缓冲区,而不是 CString 对象。
  • 实际上,您可以使用CString::GetBuffer,然后使用CString::ReleaseBuffer,但仍然不是最好的方法。
  • 由于您使用的是 MFC,您也可以使用 CString 类完全使用 Find 然后获取子字符串。
  • 如果你打算使用 MFC(真的 使用),你通常希望尽可能避免使用 C 函数,只在你无法获得的地方使用 GetBuffer围绕它(API调用等)。另一方面,您可以只在此处使用 C 样式字符串并保留 sscanf,因为您根本不使用 CString

标签: c++ mfc


【解决方案1】:

如上所述,不要混合 C“字符串”和 MFC CStrings。这是使用 MFC CString 的解决方案:

const int iColon = myString.Find(':');
if (iColon >= 0)
  {
  firstString = myString.Left(iColon);
  secondString = myString.Mid(iColon+1);
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-11
    • 2020-07-18
    • 2013-02-09
    相关资源
    最近更新 更多