【问题标题】:C Convert char into char*C 将 char 转换为 char*
【发布时间】:2012-07-01 08:51:22
【问题描述】:

我有一个来自fgetschar,我想知道如何将它转换为char*

我确信这之前已经发布过,但我找不到一个正在做我想做的事的人。任何答案表示赞赏。

编辑: 这是代码。

char *filename = "file.txt";
FILE *file = fopen(filename, "r");
if(file != NULL) {
  char line[260];
  char *fl;
  while(fgets(line, sizeof line, file) != NULL) {
    // here I combine some strings with the 'line' variable.
    str_replace(line, "\"", "\"\""); // A custom function, but it only takes char*'s.
  }
  printf(fl);
  printf("\n");
} else {
  printf(" -- *ERROR* Couldn't open file.\n");
}

【问题讨论】:

  • 不,你没有。 fgets() 返回 char* 结果,而不是 char。请让我们更好地了解您想要做什么,最好发布一些实际代码。
  • 哦。我的错。这意味着我不再需要这个问题了。
  • 那么您可以(并且应该)自己删除问题。
  • @KeithThompson 它有一个赞成的答案,OP 不能再删除它了。
  • #define TOCHARARRAY(c) ({ \ char arr[] = { c, 0 }; \ arr; \ })

标签: c char type-conversion


【解决方案1】:

首先,linechars 的数组,因此可以以与 char * 大致相同的方式进行操作(有关重要​​差异,请参阅 comp.lang.c FAQs),所以你不需要需要担心。

但是,如果您想回答一般性问题...

& 运算符是您所需要的:

char c;
char *pChar = &c;

但是,请记住 pChar 是指向 char 的指针,并且仅当 c 在范围内时才有效。这意味着您不能从函数中返回 pChar 并期望它起作用;它将指向堆的某些部分,你不能指望它保持有效。

如果要将其作为返回值传递,则需要 malloc 一些内存,然后使用指针写入 c 的值:

char c;
char *pChar = malloc(sizeof(char));

/* check pChar is not null */

*pChar = c;

【讨论】:

  • "linechar *,因为它是 chars 的数组" -- 不,数组不是指针。阅读comp.lang.c FAQ 的第 6 部分。
  • @KeithThompson:“……尽管它们密切相关”。 Question 6.2
  • 问题 6.2 清楚地表明它们是完全不同的概念。是的,它们密切相关;任何编程语言中的许多概念也是如此。有一个普遍的误解,认为 C 数组真的是指针。我们不要添加它。
  • 善于概括,但我认为如果它使用两个字符的数组,这个答案会好很多,第一个是 c,第二个是 NUL,展示了如何“转换”一个字符到一个以 NUL 结尾的字符串...编辑:啊,我看到丹尼尔就是这样做的...
【解决方案2】:

使用& 运算符将为您提供指向该字符的指针,正如 Dancrumb 所提到的,但是正如他所提到的,存在范围阻止您返回指针的问题。

我必须补充的一点是,我想您想要char* 的原因是您可以将它用作printf 中的字符串或类似的东西。您不能以这种方式使用它,因为字符串不会被NULL 终止。要将char 转换为字符串,您需要执行类似的操作

char c = 'a';
char *ptr = malloc(2*sizeof(char));
ptr[0] = c;
ptr[1] = '\0';

别忘了稍后释放ptr

【讨论】:

  • malloc 参数:sizeof(char)1 按标准;你只能写:malloc(2) 相当于。
  • @Jack,有什么特别的理由这样做,而不是遵循使用sizeof 的通常公式?
  • 当 char 被强制为字节时,将字符数转换为字节数似乎不必要地冗长。在为foo 的副本分配空间时,您会写malloc((strlen(foo)+1)*sizeof(char)) 吗?无论如何,我更喜欢foo = malloc(n*sizeof *foo),不管 foo 的类型如何。
猜你喜欢
  • 2013-12-31
  • 2012-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-22
  • 2021-11-30
  • 2010-10-12
  • 2021-04-29
相关资源
最近更新 更多