有人可以解释为什么我在使用以下g ++编译器编译源代码时出现此错误
#include <cstdio>
#include <string>
using namespace std;
int main()
{
char source_language[50];
scanf("%16s\n",source_language);
int length = sizeof(source_language);
int sizeofchar = strlen(source_language);
printf("%d\n",sizeofchar);
}
Run Code Online (Sandbox Code Playgroud)
这给了我以下错误
test.cpp:在函数'int main()'中:
test.cpp:31:错误:在此范围内未声明'strlen'
当我改变#include <string>为 #include <string.h> 或#include<cstring>,它工作正常,我需要弄清楚使用#include<string>和有什么区别#include<string.h>.非常感谢任何帮助
将char*作为参数传递给函数时,被调用函数是否应该对该字符串执行free?否则,数据将"丢失",程序将泄漏数据.或者编译器以特殊方式处理char*以避免每个人不得不一直处于空闲状态并自动删除它超出范围?我将"字符串"传递给函数,因此不将实例传递给已存在的char*.或者应该使用char []代替?只是觉得为参数输入设置一个固定的限制是如此愚蠢.
[编辑]
好的,这是有道理的,谢谢sharptooth和CashCow.您不能删除分配为const的数据,这会使字符串文字无法解决.所以,如果我将初始化更改为如下所示:
char **groups = new char*[2];
char *s1 = new char[10];
char *s2 = new char[10];
char c1 = 'a';
char c2 = 'b';
for(int i = 0; i < 9; i++)
{
s1[i] = c1;
s2[i] = c2;
}
s1[9] = NULL;
s2[9] = NULL;
groups[0] = s1;
groups[1] = s2;
Run Code Online (Sandbox Code Playgroud)
硬代码我的for循环使它只迭代i = 1和i = 2,然后一切正常.
我注意到,int arraySize = sizeof arr / sizeof *arr;当数组分配new []而不是local时,似乎只能工作.这是因为我的原始char ** groups;变量衰减到指针,对吧?
现在我想知道,无论如何判断数据是否为常量?
[原版的]
我知道数组和指针是邪恶的,并且有一些称为向量和链表的伟大事物.
但是,在内存管理方面,我是一个新手,我感觉有点自虐.假设我创建一个C字符串数组.我知道,从这个问题 …
这里的C++新手有一个简单的问题.如何将CString的内容打印到控制台?
这样做
int main(array<System::String ^> ^args)
{
CString cs1 = _T("Hy");
CString cs2 = _T(" u");
CString cs3 = cs1 + cs2;
Console::WriteLine(cs3);
printf("%s", cs3);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在控制台上输出"True"和"H".TIA.
这似乎是一个本来应该已经回答的问题,但我似乎找不到令人满意的东西.无论如何,我需要从一个看起来像这样的函数返回:
{ {"foo", "bar"}, {"baz", "foo"}, {"foo", "bar"} }
Run Code Online (Sandbox Code Playgroud)
我熟悉它的用法,argv我理解它的类型意味着什么,但由于某种原因,我无法得到上述表达式的类型正确.在最里面的部分总会有2个字符串文字,因此我想到的是其中之一
char **s[2] or char *(*s[2])
Run Code Online (Sandbox Code Playgroud)
应该是我所追求的,但由于某种原因,无论我尝试迭代和使用时的尝试,我总是会遇到段错误printf.此外,编译器经常抱怨不兼容的指针类型,多余的元素和太多的大括号.这是当前的代码:
char *(*s[2]) = { {"foo", "bar"}, {"baz", "spam"}, {"eggs", "ham"} };
Run Code Online (Sandbox Code Playgroud) 我工作的一个项目,我已经在转换的一个问题stucked CStringW到CStringA像日语多字节字符串.
我正在使用LoadString()Method 从字符串资源加载字符串.我尝试过以下代码,但似乎没有用.
CStringW csTest;
csTest.LoadString(JAPANESE_STRING);
CStringA Msg = CStringA(csTest); // Msg has been returned blank string
Run Code Online (Sandbox Code Playgroud)
和
std::string Msg = CW2A(csTest);// Msg has been returned blank string
Run Code Online (Sandbox Code Playgroud)
我也试过
wcstombs()了.
任何人都可以告诉我如何转换CStringW为CString?提前致谢.
我正在研究一个较旧的MFC/C++项目,该项目使用MFC的CString类来解析大型文本文件以处理字符串.我注意到在解析过程中有很多小部件添加到整个大型CString对象中:
//'strContainer' = CString
//'tag' = CString of a much smaller size
strContainer += L"<" + tag + L">";
Run Code Online (Sandbox Code Playgroud)
当strContainer变量达到一定的较大尺寸时,上面的运算符似乎会降低CString的整体性能.我想这种情况会发生,因为+=操作员经常重新分配内存.
所以我很好奇,有没有办法改善这个?
PS1.我不知道预先分配结果字符串的大小.
PS2.由于项目本身的复杂性,我必须坚持使用CString.(或者,我无法切换到Boost或其他更新的实现.)
可以的CString ::格式()接受常量的std :: string?
例:
void some_func( const std::string a_string )
{
CString b_string("World");
CString c_string;
c_string.Format("%s %s!", a_string, b_string);
/* print c_string */
};
Run Code Online (Sandbox Code Playgroud) 我公司使用这样的代码:
std::string(CT2CA(some_CString)).c_str()
Run Code Online (Sandbox Code Playgroud)
我认为它将Unicode字符串(其类型为CString)转换为ANSI编码,此字符串用于电子邮件的主题.但是,电子邮件的标题(包括主题)表示邮件客户端应将其解码为unicode(这是原始代码的作用).因此,一些像"äöü"这样的德国字母将无法正确显示为标题.
无论如何,我可以将此标头放回UTF8并存储到std :: string或const char*?
我知道有很多更聪明的方法可以做到这一点,但我需要保持代码坚持原来的(即将头部发送为std :: string或const char*).
提前致谢.