标签: cstring

C - 如何逐行读取字符串?

在我的C程序中,我有一个字符串,我想一次处理一行,理想情况下通过将每行保存到另一个字符串,用所述字符串做我想要的,然后重复.但我不知道如何实现这一目标.

我在考虑使用sscanf.在sscanf中是否存在"读指针",就像我从文件中读取一样?这样做的另一种选择是什么?

c cstring

6
推荐指数
1
解决办法
2万
查看次数

CString最大长度

CString对象可以容纳的字符的最大长度是多少?

mfc cstring

5
推荐指数
1
解决办法
2万
查看次数

怎样才能更安全地编写这个C片段?

我有以下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的一部分.这似乎是一个非常主观的问题,所以我不确定我是不是接受实际上是最好的.无论如何,谢谢你的所有答案.

c memory-management cstring strdup null-terminated

5
推荐指数
3
解决办法
433
查看次数

如何将ATL/MFC CString转换为QString?

鉴于项目的编码可能是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)

你认为它有效吗?还有其他想法吗?

c++ qt mfc atl cstring

5
推荐指数
1
解决办法
6552
查看次数

如何交换 MFC CString?

好的,所以我完全接受了复制和交换习语,我想我主要知道如何实现它。

但是,或者代码库使用MFC 的 CString 类作为字符串,这不会改变。

既然swap必须(应该???)不抛出,我不能

std::swap(this->my_cstring, rhs.my_cstring);
Run Code Online (Sandbox Code Playgroud)

因为这将创建一个可能抛出的临时 CString 对象。(加上它的低效。)

那么我还剩下什么?我应该添加一个try-catch吗?我真的应该允许这种(好吧,非常罕见)内存不足的情况引发异常并使交换失败?

查看 CStrings 实现,似乎没有允许交换的成员或函数......

mfc swap cstring visual-c++ copy-and-swap

5
推荐指数
1
解决办法
1377
查看次数

C编程打印字符数组

我有一个声明为:

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)

c cstring

5
推荐指数
2
解决办法
5万
查看次数

memset()的意外行为

我在所有元素中用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函数异常行为背后的原因是什么?

c++ cstring

5
推荐指数
1
解决办法
194
查看次数

我们应该将COM中的BSTR类型视为值还是引用?

从书籍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)

c++ com atl bstr cstring

5
推荐指数
1
解决办法
3918
查看次数

MFC C++ 如何在 MessageBox 中显示 const char 值?

我希望标题足以帮助解释需要什么。解决了这个问题后,我的大部分项目应该完成了。

当我这样做时

    char e[1000] = "HELLO";
    CString msg;
    msg.Format(_T("%s"), e);
    MessageBox(msg);
Run Code Online (Sandbox Code Playgroud)

消息框只是向我显示诸如“??????”之类的随机词 而不是我想要的“你好”。我该如何解决这个问题??

帮助将不胜感激。谢谢你

c++ mfc char cstring

5
推荐指数
1
解决办法
1万
查看次数

使用C风格的字符串调用C函数

我很难打电话给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样式字符串?

我想我已经在某处读过字符串文字(constimmutable)可以隐式转换为零(空)终止字符串.

string d cstring null-terminated

5
推荐指数
2
解决办法
185
查看次数

标签 统计

cstring ×10

c++ ×4

mfc ×4

c ×3

atl ×2

null-terminated ×2

bstr ×1

char ×1

com ×1

copy-and-swap ×1

d ×1

memory-management ×1

qt ×1

strdup ×1

string ×1

swap ×1

visual-c++ ×1