标签: c-strings

如何使用C++引用交换两个C样式字符串?

下面的代码给我一个编译错误,但我不明白我做错了什么.对于提出这么愚蠢的问题很抱歉.

$ 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)

c++ swap c-strings

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

const char*在循环期间改变值

我有一个迭代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继续为"+++++++++++++++++++++++++++++++++++++++++++++++++++ +." 然而,在第四次迭代, …

c++ pointers const-char c-strings

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

为什么fstream :: open()期望一个C风格的字符串?

所以我正在运行这段示例代码:

#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)

c++ fstream c-strings

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

C++中CString的字节数

我有一个存储在CString中的unicode字符串,我需要知道这个字符串采用utf-8编码的数字字节.我知道CString有一个方法CString,但返回的字符数,而不是字节.

我尝试(除了其他东西)转换为char数组,但我得到(逻辑上,我猜)只有数组getLength(),所以这不能解决我的问题.

要清楚我的目标.对于输入,wchar_t我想说我想要"3"作为输出(因为"a"在utf-8中占用一个字节).但是对于输入"āaa",我希望看到输出"4"(因为ā是两个字节的字符).

我认为这必须是相当普遍的要求,但即使经过1.5小时的搜索和试验,我也找不到正确的解决方案.

我对Windows编程的经验很少,所以也许我遗漏了一些关键信息.如果您有这种感觉,请告诉我,我会添加您要求的任何信息.

c++ unicode mfc c-strings utf-8

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

C字符数组及其长度

我现在正在用"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进行编译.

c c-strings

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

如何通过gets将字符串输入到带有空字符的C?

我试图演示缓冲区溢出,我希望覆盖一个本地变量gets.我用gcc编译了我的程序-fno-stack-protector,所以我知道使用的缓冲区gets就在我试图覆盖的另一个局部变量的旁边.我的目标是溢出缓冲区并覆盖相邻变量,以便它们都具有相同的字符串.但是,我注意到我需要能够输入'\0'字符,以便strcmp实际显示两者都相等.我怎么输入'\0'

c gcc gets c-strings buffer-overflow

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

为什么头文件在Windows中工作但在Mac和Linux上不工作?(strrev)

我正在探索C++代码cstring内部的工作.常用的功能之一是.strrev()

但我发现在Mac和Linux上这个函数被认为是未定义的,即使我包含头文件<cstring><string.h>.

我计算机上的错误的屏幕截图

但是,该功能在Windows上运行正常.

(我知道我可以自己定义函数,因为此处提供的解决方案在Linux上不可用)

这可能是一个非常天真的问题,但不是不同平台上的头文件的定义应该是相同的吗?或者每个平台都有不同的头文件定义?

另一个奇怪的事情是我strrev()<cstring>头文件的描述中没有找到(cstring头文件描述),但是如果我在Windows上没有包含这个头文件我得到一个错误,当我包含它时错误就解决了.

c++ c-strings

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

从std :: string创建CString的C++失败

在我的基于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每次运行它的值都不同,但长度似乎是不变的.其他一些结果是042219B0042C4378.

我已经尝试了这个线程中讨论的每个变体,结果是一样的.我还试图将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,这也没有帮助.

c++ mfc c-strings stdstring visual-studio

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

将其插入没有Null终止符的字符串是否安全?

考虑以下代码:

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相同数量的字符?

c++ string c-strings null-terminated strncpy

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

字符串数组将不打印单个字符

我需要打印一个字符串数组的元素,每个元素都包含一个字符。通常可以使用一维char数组,但就我而言,我需要使用字符串来存储它们。

我尝试了相同的代码,但每个元素的长度都超过一个字符,而且似乎可以正常工作,但是对于单个字符,我无法弄清楚。

void hands(){
    char suits[4][1] = {"A", "K", "Q", "J"};
    printf("%s", suits[0]);
}
Run Code Online (Sandbox Code Playgroud)

我期望输出为“ A”,而不是“ AKQJ {; W?”

c arrays string c-strings

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