标签: c-strings

从函数返回动态C样式字符串?

基本上我有一个大致看起来像这样的功能,我需要退出.

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)

c++ winapi function c-strings

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

从C中的函数返回一个String

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)

谁能告诉我这里哪里出错了?试图进行测试运行,当我尝试调用它时它不会输出任何内容.

c pointers c-strings

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

假设带有'text/*'的HTTP数据包永远不会有'\ 0',总是安全的吗?

我正在编写一个使用HTTP进行通信的嵌入式C程序.我已经有了它的工作,但我以前没有做太多的网络,只是想确保我没有做任何非常糟糕的假设.

我可以安全地假设任何具有Content-Type类型的非恶意HTTP数据包text/<something>都不会为零吗?我的代码中有很多地方只依赖于字符串末尾的'\ 0'.我确实有一些保护措施,它会在给定的Content-Length之后一直停止,并且永远不会溢出我写入的缓冲区,但是我想尽可能地确保低级别的东西能够工作,因为一旦这些设备出货,我将无法更新这些部件.

此外,有人能指出我在网络编程中有任何共同的gottchas的资源吗?

c network-programming http c-strings

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

NSStrings之前的'@'实际上是一个重载运算符吗?

在处理NSStrings时,我们总是需要@在字符串的开头包含de .例如:

NSString *string = @"Hello, World!";

string是班级的一个对象NSString.

刚刚超越我的想法,@可能是重载运算符,将C字符串转换为类的对象NSString.

是这样吗?或者它只是我的小说心灵的遐想?

c operator-overloading objective-c c-strings nsstring

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

&"string"与"string"的地址相同吗?

我有一些生成的C代码,如下所示:

char *example[] = {&" ",&"\n", &"\t"};
Run Code Online (Sandbox Code Playgroud)

如果我自己写这个,我会丢掉&符号(&),因为字符串文字已经是类型char *.对我来说,看起来example 应该已经生成声明为char**[].

我可以确定指针是否与&s 相同?这是否取得了C中定义好的地址?

编辑:我正在调查当前生命周期中某些不接受任何更改的软件的警告.是否printf("%p", &"hello world");总是一样的printf("%p", "hello world");,还是这依赖于编译器?

c string c-strings memory-address

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

在C中使用宏

我试图将输出生成为双引号输入.例如,如果在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

c c-strings

2
推荐指数
2
解决办法
111
查看次数

sgetn没有Null终止字符串

sgetn取一个char*for它的第一个参数并将字符写入其中.它不是写一个尾随'\0'char*.

这种行为似乎与我可以找到char*写入的所有其他时间不一致.但是,它在Clang,gcc和Visual Studio中一致的,所以我无法相信它是所有编译器都有的错误.

是否有一个原因,该标准不要求尾部'\0'char*

[ 实例 ]

c++ buffer c-strings stringstream null-terminated

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

将非null终止c字符串转换为终止c字符串的最简洁方法

我有一些遗留函数返回非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++ templates c-strings null-terminated c++03

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

将C++与Rust连接 - 返回CString恐慌

我试图用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++ c-strings rust

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

如何使用strcat()函数?

我是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函数中返回不同的结果.提前致谢.

c string pointers c-strings strcat

2
推荐指数
2
解决办法
1569
查看次数