我知道我可能会用这个问题击败死马,但我有点困惑,我还没有找到SO或谷歌的确切答案(我有信心是对的 - 这里有太多的信息在C字符串上筛选).另外,我已经将它标记为C++,因为这是我感兴趣的,即使我们特别谈论的是C风格的字符串.
在这种情况下:
char const a* = "hello";
char const b[] = "goodbye";
Run Code Online (Sandbox Code Playgroud)
我本来以为"你好"和"再见"是不可变的字符串,因为它们来自应衰减到一个char*常量字符串常量.
我已经看到了,在这种特殊情况下,虽然,改变"你好"将是不确定的,同时改变"再见"就可以了,假设你剥去从B数组常量性.
我假设在b的情况下字符串是可变的,因为它存储在用户定义的数组中.
在这种情况下,你好,再见不同吗? 在这个例子中,由于某些原因,再见不是字符串文字.另外,如果再见不是字符串文字,我可以假设它不在全局内存中,并且在编译时间之后对它的唯一引用是留在用户数组单元格中吗?
假设我有以下代码:
#include <iostream>
#include <string>
#include <iomanip>
using namespace std; // or std::
int main()
{
string s1{ "Apple" };
cout << boolalpha;
cout << (s1 == "Apple") << endl; //true
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:系统如何在这两者之间进行检查?s1是一个对象,而"Apple"是C 风格的字符串文字。
据我所知,不能比较不同的数据类型。我在这里缺少什么?
这是我在网上找到的一个小型图书馆:
const char* GetHandStateBrief(const PostFlopState* state)
{
static std::ostringstream out;
// ... rest of the function ...
return out.str().c_str()
}
Run Code Online (Sandbox Code Playgroud)
在我的代码中,我这样做:
const char *d = GetHandStateBrief(&post);
std::cout<< d << std::endl;
Run Code Online (Sandbox Code Playgroud)
现在,起初d包含垃圾.然后我意识到,当函数返回时,我从函数中获取的C字符串将被销毁,因为它std::ostringstream是在堆栈上分配的.所以我补充说:
return strdup( out.str().c_str());
Run Code Online (Sandbox Code Playgroud)
现在我可以从函数中获取我需要的文本.
我有两个问题:
我理解正确吗?
后来我注意到out(类型std::ostringstream)分配了静态存储.这是不是意味着在程序终止之前该对象应该留在内存中?如果是这样,为什么不能访问该字符串?
编写在C中返回字符串的方法时,什么是更好的做法?
传入缓冲区和大小:
void example_m_a(type_a a,char * buff,size_t buff_size)
Run Code Online (Sandbox Code Playgroud)
或制作和返回适当大小的字符串:
char * example_m_b(type_a a)
Run Code Online (Sandbox Code Playgroud)
PS你怎么看待返回缓冲区ptr以允许赋值样式和嵌套函数调用,即
char * example_m_a(type_a a,char * buff,size_t buff_size)
{
...
return buff;
}
Run Code Online (Sandbox Code Playgroud) 我试图找到是否有更好的方法来检查字符串是否有特殊字符.在我的例子中,除了字母数字和'_'之外的任何东西都被认为是一个特殊字符.目前,我有一个包含特殊字符的字符串,例如std :: string ="!@#$%^&".然后我使用std :: find_first_of()算法来检查字符串中是否存在任何特殊字符.
我想知道如何基于白名单来做到这一点.我想在字符串中指定小写/大写字符,数字和下划线(我不想列出它们.有什么方法可以指定某种类型的ascii范围,如[a-zA-Z0-9_] ).我怎样才能做到这一点?然后我计划使用std :: find_first_not_of().通过这种方式,我可以提到我真正想要的东西并检查相反的情况.
我从JSON结果中读取了一个字符串,如下所示:
NSString *strResult = [[NSString alloc] initWithBytes:[data bytes]
length:[data length]
encoding:NSUTF8StringEncoding];
Run Code Online (Sandbox Code Playgroud)
然后我尝试确定字符串是否等于值"N"
if ([strResult isEqualToString:@"N"])
{
[lblImageOK setHidden:YES];
}
else
{
[lblImageOk setHidden:NO];
}
Run Code Online (Sandbox Code Playgroud)
if语句allways返回else部分,即使结果为"N".它们都具有相同的值,但语句始终返回false.
请考虑以下代码:
constexpr auto f()
{
auto str = "Hello World!";
return str;
}
int main(int argc, char* argv[])
{
static constexpr auto str = f();
std::cout << str << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是正常的,我的编译器没有显示任何警告?它是否定义了行为?我能保证程序会显示"Hello World!"吗?我希望"Hello World!"不要超出功能范围......
所以我需要一些log10功能来查找存储给定整数所需的字符数.但是我想在编译时得到它来根据我的代码中定义的这些整数常量静态地确定char数组的长度.不幸的log10是,它不是一个constexpr函数,即使是整数版本.我可以制作这样的完整版本:
template <typename T>
constexpr enable_if_t<is_integral_v<T>, size_t> intlen(T param) {
size_t result{ 1U };
while(T{} != (param /= T{ 10 })) ++result;
return result;
}
Run Code Online (Sandbox Code Playgroud)
这将最终允许我这样做:c ++const char foo[intlen(13) + 1U]
是否已经为我提供了一个工具,还是我必须自己定义?
我想定义一个多维C字符串数组,该数组由多个字符串文字初始化。在C语言中,我将执行以下操作:
#include <stdio.h>
const char *strArr[2][1] = { {"foo"}, {""}};
int main(void) {
printf("%p\t%p\n", strArr[0][0], strArr[1][0]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在以下位置编译gcc -std=c18 -pedantic test.c并执行结果:
#include <stdio.h>
const char *strArr[2][1] = { {"foo"}, {""}};
int main(void) {
printf("%p\t%p\n", strArr[0][0], strArr[1][0]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如我所料,空字符串文字strArr[1][0]会衰减为有效的指针。
但是,当我在C ++中尝试相同的代码时:
#include <cstdio>
const char *strArr[2][1] = { {"foo"}, {""}};
int main(void) {
printf("%p\t%p\n", strArr[0][0], strArr[1][0]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在以下位置编译g++ -std=c++17 -pedantic test.cpp并执行结果:
$ ./a.out
0x55d95410f004 0x55d95410f008 …Run Code Online (Sandbox Code Playgroud) 我尝试使用strncmp,但它只有在我给它一个特定数量的字节我想要提取时才有效.
char line[256] = This "is" an example. //I want to extract "is"
char line[256] = This is "also" an example. // I want to extract "also"
char line[256] = This is the final "example". // I want to extract "example"
char substring[256]
Run Code Online (Sandbox Code Playgroud)
我如何提取""之间的所有元素?并把它放在变量substring?
c-strings ×10
c++ ×7
c ×3
constexpr ×2
string ×2
c++14 ×1
c-str ×1
coding-style ×1
comparison ×1
g++ ×1
logarithm ×1
objective-c ×1
pointers ×1
stdstring ×1
whitelist ×1