在C#中相当于C++的CString
MFC的CString C#等效的是什么? 解决方案 可能System.String.但是为了提供更多有用的信息: System.String实例是不可变的.串联/substring/ett实际创建新的字符串对象,因此使用字符串实例作为构建输出的缓冲区是一个非常糟糕的主意,如果您要这样做.将System.String视为const CString. System.Text.StringBuilder用于构建和操纵字符串内容.它具有.ToString()方法,您可以调用以将其内容变成适当的字符串. 您可以将char[]用作一种字符串构建器替代方案,如果您确切地知道生成的字符串将变为多长时间,但是即使这样,您也可以使用new StringBuilder(length)来指定默认的初始容量.然后,您可以使用相关的附加方法,而无需保持索引变量. (StringBuilder为您做到这一点.) 正如Billy在此问题的另一个答案中提到的那样,C#具有一个关键字string,
18 2024-04-19
编程技术问答社区
在C#中帮助处理有0个终止符的字符串
我正在使用低级本机API,在该API中我发送不安全的字节缓冲指针以获取C弦值. 所以它给了我 // using byte[255] c_str string s = new string(Encoding.ASCII.GetChars(c_str)); // now s == "heresastring\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0(etc)"; 显然我做得不正确,我是如何摆脱多余的? 解决方案 .NET字符串未终止(您可能从中猜到).因此,您可以对待" \ 0",因为您将对待任何正常角色.普通的弦乐操纵将为您解决问题.这是一些(但不是全部)选项. s = s.Trim('\0'); s = s.Replace("\0", ""); var strings = s.Split(new char[] {'\0'}, StringSplitOptions.RemoveEmptyEntries); 如果您绝对想在第一个空字
12 2024-04-11
编程技术问答社区
为Cstrings获取控制台输入
注意:这在C ++中,但使用C风格字符串 你好, 我正在处理作业,我需要从控制台中获取输入并将其保存到CSTRING中.一切都很好地编译了,但是当程序运行时,它只是跳过从用户获得输入的.因此,它将输出:"输入字符串要插入:"然后跳过CIN.GETLINE函数,然后执行下一个命令. 这是我的标题文件,cstring的声明和我遇到麻烦的代码行. #include "stdafx.h" #include #include using namespace std; int main() { char tempCString[500] = {}; //...code snipit... cout
22 2024-04-09
编程技术问答社区
写入c |字符串
我的代码segfaults,我不知道为什么. 1 #include 2 3 void overwrite(char str[], char x) { 4 int i; 5 for (i = 0; str[i] != '\0'; i++) 6 str[i] = x; 7 } 8 9 int main(void) { 10 char *s = "abcde"; 11 char x = 'X'; 12 overwrite(s, x); 13 printf("%s\n", s); 14 return 0; 15 } GDB调试器告诉我,这个问题在第6行上,我想将char存储在c弦中(如果我使用lvalue指针删除,那是同一问题.)这就是他所说的: (gdb) run Starting program: /tmp/x/x Breakpoint 1, overwrite (str=
24 2024-04-08
编程技术问答社区
SSCANF的参数少于指定的?
所以我想知道SSCANF面对这样的行时的功能: sscanf(input_string, "%s %s %s", cmd1, cmd2, cmd3); ,但说input_string仅包含1个字符串令牌.哪些值分配给CMD2和CMD3?是否有错误? 我正在使用GNU C编译器. 解决方案 什么都不会分配给额外的参数.从sscanf的返回告诉您成功完成了多少次转换,因此在这种情况下,它将返回1.您通常只是将与您期望的数字进行比较,并假设输入不好,否则: if (3 != sscanf(input_string,"%s %s %s", cmd1, cmd2, cmd3)) fprintf(stderr, "Badly formatted input (expecting three strings)\n"); 当您从文件中读取时,通常要在循环中执行直到正确输入: while (3 != scanf("%s %s %s", cmd1, cmd2,
12 2024-04-07
编程技术问答社区
使用指针对C语言字符串进行简单修改
我有两个指向同一c字符串的指针.如果我以一个指针将第二个指针递增,并将第二个指针的值分配给第一个指针,我希望更改第一个字符串的第一个字符.例如: #include "stdio.h" int main() { char* original_str = "ABC"; // Get pointer to "ABC" char* off_by_one = original_str; // Duplicate pointer to "ABC" off_by_one++; // Increment duplicate by one: now "BC" *original_str = *off_by_one; // Set 1st char of one to 1st char of other printf("%s\n", original_str); // Prints "ABC" (w
4 2024-04-07
编程技术问答社区
在C/C++中,将BSTR参数转换为ANSI的代码哪个更好?
到目前为止,我发现我可以通过两种方式将传入的BSTR转换为ANSI,我很好奇地知道一个人在速度/效率方面是否比另一个更好./p> 我一段时间使用的方式是使用USES_CONVERSION和W2A宏,例如 BSTR __stdcall F(BSTR p1, BSTR p2 ) { USES_CONVERSION; LPSTR sNum1 = W2A( p1 ); LPSTR sNum2 = W2A( p2 ); 最近,我遇到了另一种技术: BSTR __stdcall F(BSTR p1, BSTR p2 ) { long amt = wcstombs( NULL, p1, 1 ); sNum1 = (char *) malloc( amt ); wcstombs( sNum1, p1, amt ); *(sNum1 + amt) = '\0'; amt = wcstombs( NULL, p2, 1
10 2024-04-07
编程技术问答社区
我应该如何为c-string char array分配内存?
因此,在尝试学习如何在C ++中使用C串时,我会遇到内存分配问题. 这里的想法是创建了一个格式的新字符串(S1 + SEP + S2) 我正在使用的文本提供了标头,因此我无法更改它,但是我遇到了试图设置Char STR []大小的问题.我遇到了一个错误,说Slength不是恒定的,因此不能用于设置数组的大小.我对C ++相对较新,所以这是两个部分问题. 这种策略实际上是为新数组分配内存吗? 如果我无法使用strlen(char*)获得恒定值,该如何正确设置数组大小? char* concatStrings(char* s1, char* s2, char sep){ int sLength = strlen(s1) + strlen(s2) + 3; //+1 for char sep +2 for \0 at end of string char *str = new char[sLength]; strcpy (str, s1
8 2024-04-07
编程技术问答社区
如何从C-string中删除第一个字符?
有人可以帮我吗?我需要从c. 中的char *中删除第一个字符 例如,char * contents包含一个'\n'字符作为数组中的第一个字符.我需要检测和消除此字符,在"消毒"后修改原始变量. 有人可以帮助我处理代码吗?我是C的新手,似乎无法弄清楚. 解决方案 if (contents[0] == '\n') memmove(contents, contents+1, strlen(contents)); 或,如果可以修改指针: if (contents[0] == '\n') contents++; 其他解决方案 char* contents_chopped = contents + 1; 这将导致contents_chopped指向同一字符串,除了第一个字符将是\ n 之后的下一个字符 另外,此方法更快. 其他解决方案 如果您有任何内存或程序会崩溃,请不要仅仅递增指针.免费需要原始指针.您可以复制指针,制作新的内存并记忆
28 2024-04-07
编程技术问答社区
简单地用C语言加密一个字符串
我试图在打开URL时正在制作的游戏中加密查询字符串.实际上,它不一定要复杂,因为我是从游戏引擎工作的,所以需要尽可能简单.如果我的水平太低,它往往会大惊小怪. 我已经创建了查询字符串,我只需要拿起它的每个字符,然后从字符中减去15来轻轻加密它即可.我只是想进行简单的加密,以阻止大多数用户. 我希望我可以提供一个代码示例,但是我在C中的经验不太经验,而且我什至不确定从哪里开始.游戏引擎的API通常使我对我来说很简单. 解决方案 这些答案都不构成任何合理的加密形式. 您实际想做的是使用某种形式的身份验证的加密以及某种形式的安全键推导算法.我的个人建议是 libsodium "> libsodium .它提供了非常好的默认值,并且很难犯错的API. 有几种不同的方法: Secret key encryption with a random key Authenticated Encryption 秘密密钥加密,该密钥加密带有源自密码钥匙推导 与关键同意
16 2024-04-06
编程技术问答社区
不能修改C类字符串
考虑以下代码. int main(void) { char * test = "abcdefghijklmnopqrstuvwxyz"; test[5] = 'x'; printf("%s\n", test); return EXIT_SUCCESS; } 我认为,这应该打印Abcdexghij.但是,它只是终止而无需打印任何东西. int main(void) { char * test = "abcdefghijklmnopqrstuvwxyz"; printf("%s\n", test); return EXIT_SUCCESS; } 但是,这很好,所以我是否误解了操纵C字符串之类的概念?如果很重要,我正在运行Mac OS X 10.6,这是我正在编译的32位二进制文​​件. 解决方案 这个答案很好,但不完整. char * test = "abcdefghijklmnopqrstuvwxyz
10 2024-04-06
编程技术问答社区
末尾有垃圾字符的字符串阵列
我有一个Char数组缓冲区,我用来存储用户将一一输入的字符.我的代码有效,但有一些我无法弄清楚的故障: 当我执行printf以查看缓冲区中的内容时,它确实填充了,但我在结尾处得到垃圾字符 尽管被宣布为char缓冲区[8]; ,但它不会停止8个字符 有人可以向我解释发生了什么事,也许我该如何解决这个问题?谢谢. char Buffer[8]; //holds the byte stream int i=0; if (/* user input event has occurred */) { Buffer[i] = charInput; i++; // Display a response to input printf("Buffer is %s!\n", Buffer); } 输出: tagBuffer is 1┬┬w! tagBuffer is 12┬w! tagBuffer is
18 2024-04-06
编程技术问答社区
提取标签之间的CString
如何在两个标签之间提取cstring? My Text 我不想计算开始和结束位置,然后使用中间位置,也许使用stl? 有另一个更轻松的方法 解决方案 免责声明:以下想法是使用正则表达式匹配标签. 在此处下载ATL .然后,只需向下面的代码提供myString: #include "atlrx.h" CAtlRegExp regex; VERIFY( REPARSE_ERROR_OK == regex.Parse("(.*)") ); CAtlREMatchContext mc; if (!regex.Match(myString, &mc)) { // no match found } else { // match(es) found for (UINT nGroupIndex = 0; nGroupIndex
14 2024-03-18
编程技术问答社区
使用WriteFile API将一个unicode CString写入一个文件中
如何将Cstring实例的内容写入CreateFile使用WriteFile Win32 API函数打开的文件? 请注意,不使用MFC,并且Cstring包括" Atlstr.H" 编辑:我可以做 WriteFile(handle, cstr, cstr.GetLength(), &dwWritten, NULL); 或 WriteFile(handle, cstr, cstr.GetLength() * sizeof(TCHAR), &dwWritten, NULL); ? 解决方案 与ATL一样: CString sValue; CStringW sValueW(sValue); // NOTE: CT2CW() can be used instead CAtlFile File; ATLENSURE_SUCCEEDED(File.Create(sPath, GENERIC_WRITE, ...)); static const BY
18 2024-03-18
编程技术问答社区
我们应该把COM中的BSTR类型视为值还是引用?
从书籍 atl internals 中,我知道bstr与olechar*不同,并且有ccombstr和cstring的BSTR. 根据msdn 从MSDN拿起这条线, HRESULT CMyWebBrowser::put_StatusText(BSTR bstr) 我仍然不知道如何在实施中正确处理bstr.由于我仍然有一个BSTR的基本问题 - 我们应该将bstr视为一个值(例如int)或作为参考(例如int*),至少在com接口边界上. 我想尽快将BSTR转换为我的实施中的CCRSTR/CCOMBSTR.值或参考语义的转换将是完全不同的情况.我已经挖掘了CCOMBSTR.ATTACH,CCOMBSTR.ASSIGNBSTR等.但是代码无法解决我的疑问. msdn ccombstr.attach有一些代码剪切,我觉得这是错误的.110%29.ASPX" rel =" nofollow">为BSTR分配和释放记忆. ATL Internals表示,setSys
8 2024-03-18
编程技术问答社区
如何将ATL/MFC的CString转换为QString?
鉴于项目的编码可能是Unicode(但不确定),将ATL :: CSTRING转换为QString的最佳方法是什么? 我想到的是: CString c(_T("SOME_TEXT")); //... std::basic_string intermediate((LPCTSTR)c); QString q; #ifdef _UNICODE q = QString::fromStdWString(intermediate); #else q = QString::fromStdString(intermediate); #endif 您认为它有效吗?还有其他想法吗? 解决方案 您不需要中间转换为std::string. CString类可以视为简单的C风格字符串;也就是说,一个字符.您所要做的就是将其投入到LPCTSTR. ,一旦拥有,您只需要根据CString中的字符是char> char还是char或wchar_t来创建QString对象
14 2024-03-18
编程技术问答社区
我怎样才能正确地传递这个C类字符串数组?
我有一系列的c串声称为: char *argv[MAXARGS]; Maxargs基本上只是告诉我们,用于索引目的的数组中有多少个C字符串. 我想将其传递给下面的功能... int builtin_cmd(char **argv) ,但似乎什么都没有,我称之为这样的函数. char *argv[MAXARGS]; builtin_cmd(argv); 但是,一旦我进入函数builtin_cmd并尝试使用 打印 printf("%s\n", argv[0]); 它什么也没打印....但是当我在调用函数之前这样做... char *argv[MAXARGS]; printf("%s\n", argv[0]); //builtin_cmd(argv); 它将在C字符串数组中打印第一个C字符串. 我的想法是我通过结构不正确,我想知道将其传递给功能的正确方法. 编辑: int builtin_cmd(char **arg
16 2024-03-05
编程技术问答社区
你将如何改进这种算法?(c)字符串反转)
解决我在网上发现的一些编程访谈挑战时,我不得不编写一种算法来扭转const char *并将指针返回到新的char *.我想我有它,但是要使它正常工作,我必须做一些奇怪的事情 - 基本上必须考虑到无效的角色.我以某种方式觉得这是错误的,但我很难过,我想知道是否有人可以帮助我: char * reverse(const char * str) { int length = strlen(str); char * reversed_string = new char[length+1]; for(int i = 0; i
12 2024-01-23
编程技术问答社区
为什么我的char*在C++中可写,而有时却只能读?
我最近有一个很大的问题,了解char*. 假设我发挥了递归功能来恢复char*,但根据我的初始化,我会遇到一些访问违规行为,而在我的C ++底漆中,我没有找到任何东西,让我有了正确的理解途径,所以我正在寻求您的帮助. 案例1 我试图交换字母时被访问违规的第一种情况: char * bob = "hello"; 案例2 ,然后我尝试使它起作用 char * bob = new char[5]; bob[0] = 'h'; bob[1] = 'e'; bob[2] = 'l'; bob[3] = 'l'; bob[4] = 'o'; 案例3 ,但是当我做一个cout时,我在结尾处得到了一些随机的废话,所以我更改了它的 char * bob = new char[6]; bob[0] = 'h'; bob[1] = 'e'; bob[2] = 'l'; bob[3] = 'l'; bob[4] = 'o'; bob[5] = '\0'; 案例4 有效的情况,
8 2024-01-09
编程技术问答社区