【问题标题】:How to convert char[] to char* in C?如何在 C 中将 char[] 转换为 char*?
【发布时间】:2012-01-25 17:20:13
【问题描述】:

这个问题很简单。如何在 C 中将 char[] 转换为 char*? 我真的很难找到解决方案。因此,非常感谢您的帮助:)

这就是我需要这个的原因:

sprintf(name,"%c%c%%HACKED%c%c.virus",a,b,c,d); // print a formatted text to string (char[])
strcat(buffer,currentPath); // currentPath is of data type char[]
strcat(buffer,"\\");
strcat(buffer,name); // Now this is where the problem comes in. Since strcat function needs a const char* for it's second argument.

printf("%s",name);

【问题讨论】:

  • 不行吗?我的意思是,最后一个strcat?我会感到惊讶。 name 是一个真正的 char[],是吗?你没有包括它的定义。否则,printf 也会失败。
  • 专业提示:避免使用扩展名 .virus 命名您的病毒。
  • 你知道,大脑激活失败。我只是看到“string const, 不管”,甚至没有处理内容的英文含义。也许我应该提倡使用strcat 和一些粗略的指针数学:-) ++@aardvarkk
  • @aardvarkk :哈哈,其实这只是我的一个测试项目来修补语言。该程序创建了一个无限循环,它将用文件填充硬盘驱动器(具有非常大的文件大小)。所以扩展并不是那么重要。至少现在。 :D

标签: c type-conversion


【解决方案1】:

你不需要做任何事情。数组自动衰减到指针中,所以你的代码看起来很好。

在第一次调用strcat() 之前,您确实需要确保buffer 以一个有效的、以NUL 结尾的字符串开头。它还需要是可写的(例如,它不能是指向字符串文字的指针)。

您还需要确保不会溢出buffer。我建议您查看strncat()

【讨论】:

  • 好吧,我将 OP 的“这就是问题所在”读作“我在这里遇到编译器错误”。
  • strncat() 是个坏建议。总是。
  • 谢谢!愚蠢的我..我刚刚溢出了缓冲区,这就是为什么它没有在我的最后工作。
【解决方案2】:

我假设代码已使用以下内容声明缓冲区:

     char buffer[100];
     char name[100];

不是您的问题的一部分,但不要在新代码中使用strcat。绝不。查看strncat。这真的很危险strncat 不是(一样多)。

至于您的直接问题:您可以像使用char* 一样使用name。 C 编译器会自动将其转换为&(name[0])(的逻辑等价物)。

【讨论】:

  • strcat 同样危险。 strncpysprintf 等,所有潜在的段错误。
【解决方案3】:

顺便说一句,为什么愚蠢的 strcat() 事情?为什么不:

sprintf(name,"%c%c%%HACKED%c%c.virus",a,b,c,d);
sprintf(buffer,"%s\\\\%s", currentPath, name );

     /* should this be printf("%s", buffer); ?? */
printf("%s",name);

而且,正如 BPRcock 所说:snprintf() 更好。

【讨论】:

  • 或者只是sprintf(buffer, %s\\%c%c%%GEHAKT%c%c.virus",currentPath,a,b,c,d);
  • 是的,但可能是 OP 对名称部分有特殊计划。
【解决方案4】:

在 C 中,char [N] 类型的对象的值被转换为 char * 类型的值。

void *p;
char a[16] = {0}

p = a;

在表达式语句p = a; 中,值a 的类型为char *

(C99, 6.3.2.1p3) "除非它是 sizeof 运算符或一元 & 运算符的操作数,或者是用于初始化数组的字符串字面量,否则类型为 "array of type" 的表达式是转换为类型为“类型指针”的表达式,该类型指向数组对象的初始元素,并且不是左值。”

【讨论】:

    猜你喜欢
    • 2014-10-22
    • 2019-11-11
    • 2020-08-04
    • 2015-12-22
    • 2021-11-30
    • 2015-04-02
    • 2012-07-01
    • 1970-01-01
    • 2014-11-04
    相关资源
    最近更新 更多