现在有没有什么好的理由在C++中使用C-strings?我的教科书在某些方面的例子中使用它们,我觉得使用std :: string会更容易.
谁能告诉我如何在C++程序中将C样式字符串(即char*)转换为c ++样式字符串(即std :: string)?
非常感谢.
我应该怎么用,当我要复制src_str到dst_arr,为什么?
char dst_arr[10];
char *src_str = "hello";
Run Code Online (Sandbox Code Playgroud)
PS:我的头正在读的东西很多关于如何纺纱后比我的电脑硬盘快好或坏的strncpy和strlcpy.
注意:我知道strlcpy无处不在.这不是问题所在.
考虑一下代码:
struct Foo
{
const char str[] = "test";
};
int main()
{
Foo foo;
}
Run Code Online (Sandbox Code Playgroud)
它无法使用g ++和clang ++编译,基本上吐出来
error: array bound cannot be deduced from an in-class initializer
我明白这是标准可能会说的,但有什么特别好的理由吗?由于我们有一个字符串文字,似乎编译器应该能够毫无问题地推断出大小,类似于简单地声明一个类外const的类似C的空终止字符串的情况.
在我的Qt应用程序中,我的源代码文件被编码为UTF-8.对于以下代码......
QMessageBox::critical(this, "Nepoznata pogreška", "Dogodila se nepoznata pogreška! Želite li zatvoriti ovaj program ?", QMessageBox::Yes, QMessageBox::No);
Run Code Online (Sandbox Code Playgroud)
...当我显示该消息框时,字符"š"不会显示为"š",而是显示为奇怪的东西.这是因为Qt将所有C字符串转换为使用LATIN-1编码.为了解决这个问题,我一直在使用:
QMessageBox::critical(this, QString::fromUtf8("Nepoznata pogreška"), QString::fromUtf8("Dogodila se nepoznata pogreška! Želite li zatvoriti ovaj program ?"), QMessageBox::Yes, QMessageBox::No);
Run Code Online (Sandbox Code Playgroud)
有没有办法摆脱所有的电话QString::fromUtf8()?
似乎strtol()并且strtod()有效地允许(并强制)你在字符串中抛弃constness:
#include <stdlib.h>
#include <stdio.h>
int main() {
const char *foo = "Hello, world!";
char *bar;
strtol(foo, &bar, 10); // or strtod(foo, &bar);
printf("%d\n", foo == bar); // prints "1"! they're equal
*bar = 'X'; // segmentation fault
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上面,我自己没有演出.然而,strtol()基本上把我const char *变成了一个char *对我来说,没有任何警告或任何东西.(事实上,它不会让你输入bar的const char *,所以迫使类型的不安全的变化.)是不是真的很危险?
我想我非常理解如何将关键字constexpr用于简单的变量类型,但是当涉及到指向值的指针时,我感到很困惑.
我想声明一个constexpr C字符串文字,它的行为就像
#define my_str "hello"
Run Code Online (Sandbox Code Playgroud)
这意味着编译器将C字符串文字插入到我输入此符号的每个位置,并且我将能够在编译时使用sizeof获取其长度.
是吗 constexpr char * const my_str = "hello";
要么 const char * constexpr my_str = "hello";
要么 constexpr char my_str [] = "hello";
还是还有别的什么?
从CString到char*,ReleaseBuffer()必须在之后使用GetBuffer().但为什么?如果我不使用ReleaseBuffer()后会发生什么GetBuffer()?
有人能告诉我一个例子吗?谢谢.
有没有办法只打印部分字符串?
例如,如果我有
char *str = "hello there";
Run Code Online (Sandbox Code Playgroud)
有没有办法只打印"hello",请记住我要打印的子字符串是可变长度,而不是总是5个字符?
我知道我可以使用一个for循环,putchar或者我可以复制数组,然后添加一个空终止符,但我想知道是否有更优雅的方式?
我正在阅读"写大代码卷2",它显示了以下strlen inslementation:
int myStrlen( char *s )
{
char *start;
start = s;
while( *s != 0 )
{
++s;
}
return s - start;
}
Run Code Online (Sandbox Code Playgroud)
该书说,这种实现对于没有经验的C程序员来说是典型的.在过去的11年里,我一直在使用C语言进行编码,我无法在C中看到如何编写比这更好的函数(我可以想到在汇编中编写更好的东西).如何在C中编写比这更好的代码?我看了glibc中strlen函数的标准库实现,我无法理解它的大部分内容.在哪里可以找到有关如何编写高度优化代码的更好信息?