基本上我有一个大致看起来像这样的功能,我需要退出.
const char* UTF16ToUTF8(const wchar_t *in) {
int tmp = wcslen(in);
int size_needed = WideCharToMultiByte(CP_UTF8, 0, &in[0], (size_t)tmp, NULL, 0, NULL, NULL);
std::vector<char> out;
out.resize(size_needed);
WideCharToMultiByte(CP_UTF8, 0, &in[0], (size_t)tmp, &out[0], size_needed, NULL, NULL);
return &out[0];
}
Run Code Online (Sandbox Code Playgroud)
很明显,退出时会被取消引用.我有什么选择?我需要能够像这样调用这个函数.我绝对喜欢留在堆栈上.
utf8outputfile << UTF16ToUTF8(wchar_tString) << endl;
fprintf(utf8outputfile, "%s", UTF16ToUTF8(L"Mmm Mmm Unicode String ?????"));
return UTF16ToUTF8(wchar_tString);
Run Code Online (Sandbox Code Playgroud) char* clean_string (char *input_string){
/*Ensure that input string isn't null and only do heavy lifting if it's not null*/
if (input_string){
char *stripped;
stripped = (char*)malloc(strlen(input_string)*sizeof(char));
while (*input_string != '\0'){
if isalpha(*input_string){
*stripped = toupper(*input_string);
input_string++;
stripped++;
} else {
input_string++;
}
}
/* *stripped++ += '\0';*/
return stripped;
}
/*default return val*/
return NULL;
}
Run Code Online (Sandbox Code Playgroud)
谁能告诉我这里哪里出错了?试图进行测试运行,当我尝试调用它时它不会输出任何内容.
我正在编写一个使用HTTP进行通信的嵌入式C程序.我已经有了它的工作,但我以前没有做太多的网络,只是想确保我没有做任何非常糟糕的假设.
我可以安全地假设任何具有Content-Type类型的非恶意HTTP数据包text/<something>都不会为零吗?我的代码中有很多地方只依赖于字符串末尾的'\ 0'.我确实有一些保护措施,它会在给定的Content-Length之后一直停止,并且永远不会溢出我写入的缓冲区,但是我想尽可能地确保低级别的东西能够工作,因为一旦这些设备出货,我将无法更新这些部件.
此外,有人能指出我在网络编程中有任何共同的gottchas的资源吗?
在处理NSStrings时,我们总是需要@在字符串的开头包含de .例如:
NSString *string = @"Hello, World!";
string是班级的一个对象NSString.
刚刚超越我的想法,@可能是重载运算符,将C字符串转换为类的对象NSString.
是这样吗?或者它只是我的小说心灵的遐想?
我有一些生成的C代码,如下所示:
char *example[] = {&" ",&"\n", &"\t"};
Run Code Online (Sandbox Code Playgroud)
如果我自己写这个,我会丢掉&符号(&),因为字符串文字已经是类型char *.对我来说,看起来example 应该已经生成声明为char**[].
我可以确定指针是否与&s 相同?这是否取得了C中定义好的地址?
编辑:我正在调查当前生命周期中某些不接受任何更改的软件的警告.是否printf("%p", &"hello world");总是一样的printf("%p", "hello world");,还是这依赖于编译器?
我试图将输出生成为双引号输入.例如,如果在str()中传递的参数是某个名称,那么输出应该是"name",这不会出现在下面的代码中.
#include<stdio.h>
#include<string.h>
#define str(s) #s
#define newline printf("\n")
int main()
{
printf("Your double quoted code is : %s ",str(GHOST));
newline;
}
Run Code Online (Sandbox Code Playgroud)
输出:GHOST
我有一些遗留函数返回非null终止字符串.
struct legacy {
char a[4]; //not null terminated
char b[20]; //not null terminated
};
Run Code Online (Sandbox Code Playgroud)
我传递了很多这些char数组,我需要一个干净的方法将它们转换为null终止.
截至目前,这就是我在做的事情:
legacy foo;
std::string a(foo.a, sizeof(foo.a));
std::string b(foo.b, sizeof(foo.b));
bar(foo.a.c_str(), foo.b.c_str());
Run Code Online (Sandbox Code Playgroud)
有没有更清洁的方法我可以使用类和模板来减少这些代码...
legacy foo;
bar(make_null_terminated(foo.a), make_null_terminated(foo.b));
Run Code Online (Sandbox Code Playgroud) 我试图用C++调用一些用Rust编写的函数.到目前为止,我已经相当成功,但CString在运行时期间我仍然遇到一个相关恐慌的小问题.
该函数hello应该采用输入字符串,将其与其他字符串连接并返回产品.
这是我的fun.rs:
use std::ffi::CString;
#[no_mangle]
pub extern "C" fn add(a: i32, b: i32) -> i32 {
a + b
}
#[no_mangle]
pub extern "C" fn hello(cs: CString) -> CString {
let slice = cs.to_str().unwrap();
let mut s = "Hello, ".to_string();
s = s + slice;
CString::new(&s[..]).unwrap() // runtime error
// CString::new(cs).unwrap() // empty string if no borrow
// cs // works if no borrow, but this is not what I meant
}
Run Code Online (Sandbox Code Playgroud)
这是 …
我是C语言的新手.我试图使用strcat函数.
#include <stdio.h>
#include <string.h>
int main(int argc, const char *argv[]) {
char s1[] = "12345";
char s2[] = "abcde";
strcat(s1, s2);
puts(s1);
puts(s2);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这个正常运行,但是
#include <stdio.h>
#include <string.h>
int main(int argc, const char *argv[]) {
char* s1 = "12345";
char* s2 = "abcde";
strcat(s1, s2);
puts(s1);
puts(s2);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
最后一个未能返回结果.为什么两种不同的声明方式在strcat函数中返回不同的结果.提前致谢.