如何从c中的函数正确接收字符串

时间:2017-05-20 06:28:35

标签: c string

我有如下功能:

char * function(char a)
{
  char data[5];
  char *hData;
  sprintf(data,"%02X",a);
  data[5] = '\0';
  hData = data;
  return hData;
}

所以基本上是170,我需要将其转换为十六进制等效AA并返回它。在sprintf之后它被转换为AA但是我无法返回数组,因此我将其保存到字符串hData中然后返回它。返回时hData包含AA

在我的主要功能中,我收到的内容如下:

char *hex;
hex = function(buf[0]);  //This line gives warning

十六进制包含数据AA但是它为什么会发出警告。

警告说:

assignment makes pointer from integer without a cast

3 个答案:

答案 0 :(得分:1)

如果要返回字符串,则必须使用动态内存分配。像:

str_shuffle()

发布的代码返回指向局部变量的指针(即<?php $string = "123456789AaBbCcDdEeFfGgHhIiJjKkLlMmNnPpQqRrSsTtWwXxYyZz"; //You can use any string $key_len = "5"; $string_shuffle = str_shuffle($string); $session_key = str_shuffle(substr($string_shuffle, 3, $key_len)); ?> <input type="text" name="name1" value="<?php echo $session_key;?>"> )。这是无效的,因为一旦函数返回,局部变量超出范围(即不再存在)。因此,您需要使用#include<stdio.h> #include <stdlib.h> char * function(char a) { char *hData = malloc(5); // Allocate memory // Use hData just as if it was declared like hData[5] sprintf(hData, "%02X", a); hData[3] = 0; return hData; // Return a pointer to the allocated memory } int main() { // Use it like char* s = function('a'); printf("%s\n", s); free(s); return 0; } ,因为data分配的内存有效,直到您明确释放它为止。

答案 1 :(得分:1)

您的代码有几个错误:

  • 您将返回指向data数组的指针,该数组是函数中的局部变量。函数返回后,它不再有效取消引用该指针。 (它似乎似乎可以正常工作,但它也可能导致程序崩溃或导致程序错误运行。)您需要使用malloc来分配不属于本地的内存功能
  • 您已分配给data[5],但该数组仅上升到data[4]。 (请记住,数组是从零开始的,因此最高的数组索引比规模小一个。)

这是一个应该正常运行的版本:

char * function(char a)
{
  char *data = malloc(3);  // 2 for the hex digits, plus 1 for the null
  sprintf(data, "%02X", a);
  data[2] = '\0';
  return data;
}

调用此函数后,您需要在完成后释放字符串。以下是main函数的示例:

int main()
{
  char *str = function('a');
  printf("Test: %s\n", str);
  free(str);  // Release the memory allocated by malloc()
}

答案 2 :(得分:-1)

您不需要返回字符串,因为默认情况下,字符串在C中通过引用传递。您在函数内所做的更改将影响实际的字符串。