在我的C程序中,我有一个字符串,我想一次处理一行,理想情况下通过将每行保存到另一个字符串,用所述字符串做我想要的,然后重复.但我不知道如何实现这一目标.
我在考虑使用sscanf.在sscanf中是否存在"读指针",就像我从文件中读取一样?这样做的另一种选择是什么?
我有以下C代码片段,必须识别错误并建议更安全地编写它的方法:
char somestring[] = "Send money!\n";
char *copy;
copy = (char *) malloc(strlen(somestring));
strcpy(copy, somestring);
printf(copy);
Run Code Online (Sandbox Code Playgroud)
所以错误是strlen忽略'\0'了字符串的尾随,因此不会为副本分配足够的内存,但是我不确定他们更安全地写它是什么?
我可以使用malloc(strlen(somestring)+1))我假设,但我认为必须有一个比这更好的方法?
编辑:好的,我接受了答案,我怀疑我们不会期待strdup解决方案,因为它不是ANSI C的一部分.这似乎是一个非常主观的问题,所以我不确定我是不是接受实际上是最好的.无论如何,谢谢你的所有答案.
鉴于项目的编码可能是Unicode(但不确定),将ATL :: CString转换为QString的最佳方法是什么?
我想到的是:
CString c(_T("SOME_TEXT"));
//...
std::basic_string<TCHAR> intermediate((LPCTSTR)c);
QString q;
#ifdef _UNICODE
q = QString::fromStdWString(intermediate);
#else
q = QString::fromStdString(intermediate);
#endif
Run Code Online (Sandbox Code Playgroud)
你认为它有效吗?还有其他想法吗?
好的,所以我完全接受了复制和交换习语,我想我主要知道如何实现它。
但是,或者代码库使用MFC 的 CString 类作为字符串,这不会改变。
既然swap必须(应该???)不抛出,我不能做
std::swap(this->my_cstring, rhs.my_cstring);
Run Code Online (Sandbox Code Playgroud)
因为这将创建一个可能抛出的临时 CString 对象。(加上它的低效。)
那么我还剩下什么?我应该添加一个try-catch吗?我真的应该允许这种(好吧,非常罕见)内存不足的情况引发异常并使交换失败?
查看 CStrings 实现,似乎没有允许交换的成员或函数......
我有一个声明为:
char *array[size];
Run Code Online (Sandbox Code Playgroud)
当我表演时
printf("%s", array);
Run Code Online (Sandbox Code Playgroud)
它给了我一些垃圾字符,为什么会这样呢?
http://www.cplusplus.com/reference/clibrary/cstdio/printf/
这个url表示printf的格式为:`int printf(const char*format,...);
#include <stdio.h>
#include <string.h>
#define size 20
#define buff 100
char line[buff];
int main ()
{
char *array[100];
char *sep = " \t\n";
fgets(line, buff, stdin);
int i;
array[0] = strtok(line, sep);
for (i = 1; i < size; i++) {
array[i] = strtok(NULL, sep);
if (array[i] == NULL)
break;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我在所有元素中用99初始化数组
#include<iostream>
#include<cstring>
int main(){
int a[10];
memset(a,99,10);
std::cout<<a[0]<<std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但我得到的输出是出乎意料的.
输出: -
1667457891
这个memset函数异常行为背后的原因是什么?
从书籍ATL Internals,我知道BSTR与OLECHAR*不同,并且BSTR有CComBSTR和CString.
根据MSTR为BSTR分配和释放内存,我知道调用者/被调用者的内存管理责任.
从MSDN获取此行,
HRESULT CMyWebBrowser::put_StatusText(BSTR bstr)
我仍然不知道如何bstr在我的实现中正确处理.因为我仍然有BSTR的基本问题 - 我们应该将其bstr视为值(如int)或作为引用(如int*),至少在COM接口边界上.
我希望在我的实现中尽快将BSTR转换为CString/CComBSTR.对于转换,值或引用语义将完全不同.我已经深入研究CComBSTR.Attach,CComBSTR.AssignBSTR等.但代码无法解决我的疑虑.
MSDN CComBSTR.Attach有一些代码片段,我觉得这是错误的,因为它不服从BSTR的分配和释放内存.ATL Internals表示SetSysString将'释放传入的原始BSTR',如果我使用它,它将违反BSTR参数约定,就像CComBSTR.Attach一样.
总而言之,我想在实现中使用CString来处理原始BSTR,但是不知道正确的方法......我在我的项目中写了一些正常的工作代码,但我总是感到紧张,因为我不知道是否我是对的.
我来谈谈编码语言
HRESULT CMyWebBrowser::put_StatusText(BSTR bstr)
{
// What I do NOT know
CString str1; // 1. copy bstr (with embeded NUL)
CString str2; // 2. ref bstr
// What I know
CComBSTR cbstr1;
cbstr1.AssignBSTR(bstr); // 3. copy bstr
CComBSTR cbstr2;
cbstr2.Attach(bstr); // 4. ref bstr, do not copy
// What I do NOT know
// Should …Run Code Online (Sandbox Code Playgroud) 我希望标题足以帮助解释需要什么。解决了这个问题后,我的大部分项目应该完成了。
当我这样做时
char e[1000] = "HELLO";
CString msg;
msg.Format(_T("%s"), e);
MessageBox(msg);
Run Code Online (Sandbox Code Playgroud)
消息框只是向我显示诸如“??????”之类的随机词 而不是我想要的“你好”。我该如何解决这个问题??
帮助将不胜感激。谢谢你
我很难打电话给mktempD:
import core.sys.posix.stdlib;
import std.string: toStringz;
auto name = "alpha";
auto tmp = mktemp(name.toStringz);
Run Code Online (Sandbox Code Playgroud)
但我无法弄清楚如何使用它,所以DMD抱怨:
/home/per/Work/justd/fs.d(1042): Error: function core.sys.posix.stdlib.mktemp (char*) is not callable using argument types (immutable(char)*)
Run Code Online (Sandbox Code Playgroud)
如何创建可变的零终止C样式字符串?
我想我已经在某处读过字符串文字(const或immutable)可以隐式转换为零(空)终止字符串.