C 将 char 转换为 char*
Posted
技术标签:
【中文标题】C 将 char 转换为 char*【英文标题】:C Convert char into char* 【发布时间】:2012-07-01 08:51:22 【问题描述】:我有一个来自fgets
的char
,我想知道如何将它转换为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; \ )
【参考方案1】:
首先,line
是 char
s 的数组,因此可以以与 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;
【讨论】:
"line
是 char *
,因为它是 char
s 的数组" -- 不,数组不是指针。阅读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 的类型如何。以上是关于C 将 char 转换为 char*的主要内容,如果未能解决你的问题,请参考以下文章