下面的代码给我一个编译错误,但我不明白我做错了什么.对于提出这么愚蠢的问题很抱歉.
$ cat swapcstrings.cc
#include <iostream>
void swap(char*& c, char*& d) {
char* temp = c;
c = d;
d = temp;
}
int main() {
char c[] = "abcdef";
char d[] = "ghijkl";
std::cout << "[" << c << "," << d << "]\n";
swap(c, d);
std::cout << "[" << c << "," << d << "]\n";
}
$ g++ swapcstrings.cc
swapcstrings.cc: In function ‘int main()’:
swapcstrings.cc:13: error: invalid initialization of non-const reference of type ‘char*&’ from a temporary …Run Code Online (Sandbox Code Playgroud) 我有一个迭代a的函数,const char *并使用该字符将对象添加到一个实例中,std::map如果它是一系列已识别的字符之一.
#define CHARSEQ const char*
void compile(CHARSEQ s) throw (BFCompilationError)
{
std::cout << "@Receive call " << s << std::endl;
for(int i = 0; s[i] != '\0'; i++)
{
if (std::string("<>-+.,[]").find_first_of(s[i]) == std::string::npos)
{
throw BFCompilationError("Unknown operator",*s,i);
}
std::cout << "@Compiling: " << s[i] << std::endl;
std::cout << "@address s " << (void*)s << std::endl;
std::cout << "@var s " << s << std::endl;
controlstack.top().push_back(opmap[s[i]]);
}
}
Run Code Online (Sandbox Code Playgroud)
传递的字符序列是"++++++++++."
前三次迭代,print语句显示'+','+'和'+'的预期值,值s继续为"+++++++++++++++++++++++++++++++++++++++++++++++++++ +." 然而,在第四次迭代, …
所以我正在运行这段示例代码:
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
int main() {
ifstream inFile;
string str;
cout << "\nEnter file name : ";
cin >> str;
try {
inFile.open(str);
if(!inFile)
throw exception();
} catch(exception e) {
cout <<"\nAn exception was caught. file does not exist. ";
return 1;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它给了我一个编译器错误:
test.cpp:14:13: error: no viable conversion from 'string' (aka 'basic_string<char>') to 'const char *'
inFile.open(str);
^~~
/usr/include/c++/4.2.1/fstream:517:24: note: passing argument to parameter '__s' here
open(const char* __s, ios_base::openmode __mode = …Run Code Online (Sandbox Code Playgroud) 我有一个存储在CString中的unicode字符串,我需要知道这个字符串采用utf-8编码的数字字节.我知道CString有一个方法CString,但返回的字符数,而不是字节.
我尝试(除了其他东西)转换为char数组,但我得到(逻辑上,我猜)只有数组getLength(),所以这不能解决我的问题.
要清楚我的目标.对于输入,wchar_t我想说我想要"3"作为输出(因为"a"在utf-8中占用一个字节).但是对于输入"āaa",我希望看到输出"4"(因为ā是两个字节的字符).
我认为这必须是相当普遍的要求,但即使经过1.5小时的搜索和试验,我也找不到正确的解决方案.
我对Windows编程的经验很少,所以也许我遗漏了一些关键信息.如果您有这种感觉,请告诉我,我会添加您要求的任何信息.
我现在正在用"C编程绝对初学者指南"(第3版)学习C,并且写了所有字符数组的大小应该等于string length + 1(字符串终止零长度).但是这段代码:
#include <stdio.h>
main()
{
char name[4] = "Givi";
printf("%s\n",name);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出Givi而不是Giv.数组大小是,4并且在这种情况下它应该输出Giv,因为4(字符串长度)+ 1(字符串终止零字符长度)= 5,并且字符数组大小是唯一的4.
为什么我的代码输出Givi而不是Giv?
我正在使用MinGW 4.9.2 SEH进行编译.
我试图演示缓冲区溢出,我希望覆盖一个本地变量gets.我用gcc编译了我的程序-fno-stack-protector,所以我知道使用的缓冲区gets就在我试图覆盖的另一个局部变量的旁边.我的目标是溢出缓冲区并覆盖相邻变量,以便它们都具有相同的字符串.但是,我注意到我需要能够输入'\0'字符,以便strcmp实际显示两者都相等.我怎么输入'\0'?
我正在探索C++代码cstring内部的工作.常用的功能之一是.strrev()
但我发现在Mac和Linux上这个函数被认为是未定义的,即使我包含头文件<cstring>或<string.h>.
但是,该功能在Windows上运行正常.
(我知道我可以自己定义函数,因为此处提供的解决方案在Linux上不可用)
这可能是一个非常天真的问题,但不是不同平台上的头文件的定义应该是相同的吗?或者每个平台都有不同的头文件定义?
另一个奇怪的事情是我strrev()在<cstring>头文件的描述中没有找到(cstring头文件描述),但是如果我在Windows上没有包含这个头文件我得到一个错误,当我包含它时错误就解决了.
在我的基于MFC的应用程序中,此代码:
std::string stdString("MappingName");
std::cout << "as String: " << stdString << std::endl;
CString cString(stdString.c_str());
std::cout << "as CString: " << cString << std::endl;
Run Code Online (Sandbox Code Playgroud)
生成此输出:
as String: MappingName
as CString: 01DEA060
Run Code Online (Sandbox Code Playgroud)
CString每次运行它的值都不同,但长度似乎是不变的.其他一些结果是042219B0和042C4378.
我已经尝试了这个线程中讨论的每个变体,结果是一样的.我还试图将Visual Studio项目中的字符集从使用Unicode字符集更改为使用多字节字符集,同样没有任何效果.
转换失败的原因是什么?
编辑:更多的测试表明,它的价值std::string似乎没有区别:
tmp as String: The quick brown fox jumps over the lazy dog
tmp as CString: 00EAAF88
Run Code Online (Sandbox Code Playgroud)
我还将字符集设置为Not Set,这也没有帮助.
考虑以下代码:
const char foo[] = "lorem ipsum"; // foo is an array of 12 characters
const auto length = strlen(foo); // length is 11
string bar(length, '\0'); // bar was constructed with string(11, '\0')
strncpy(data(bar), foo, length);
cout << data(bar) << endl;
Run Code Online (Sandbox Code Playgroud)
我的理解是strings始终分配有一个隐藏的null元素。如果是这种情况,那么bar实际上会分配12个字符,其中第12 个字符是隐藏的'\0',这是绝对安全的...如果我错了,那cout将导致未定义行为,因为没有空终止符。
有人可以帮我确认吗?这合法吗?
关于为什么要使用strncpy而不是仅使用string(const char*, const size_t)构造函数存在很多问题。我的目的是使玩具代码接近包含的实际代码vsnprintf。不幸的是,即使在这里获得了出色的答案之后,我仍然发现它的vsnprintf行为与并不相同strncpy,并且我在这里提出了一个后续问题:为什么vsnprintf不会写与strncpy相同数量的字符?
我需要打印一个字符串数组的元素,每个元素都包含一个字符。通常可以使用一维char数组,但就我而言,我需要使用字符串来存储它们。
我尝试了相同的代码,但每个元素的长度都超过一个字符,而且似乎可以正常工作,但是对于单个字符,我无法弄清楚。
void hands(){
char suits[4][1] = {"A", "K", "Q", "J"};
printf("%s", suits[0]);
}
Run Code Online (Sandbox Code Playgroud)
我期望输出为“ A”,而不是“ AKQJ {; W?”