从字符串构建char数组(C)

时间:2015-10-22 00:59:10

标签: c arrays function pointers types

我在C中编写一个简单的函数,它应该从字符串" abc"中构建一个char数组。 - 所以它应该构建{' a'' b' c'} - 并返回指向该数组的指针。这是我的函数代码:

char * makeArr()
{
    static char arr[3];

    sprintf(arr, "%s\n", "abc");

    return arr;
}

当我在main中调用此方法时出现问题:

int main(int argc, char *argv[])
{
    char *arr[3];

    arr = makeArr();

    return 0;
}

编译器抱怨转换/冲突类型。我现在已经玩指针,投射和解除引用了很长一段时间,但似乎无法让它发挥作用。请告诉我逻辑错误的地方。

5 个答案:

答案 0 :(得分:2)

除此之外,你感到困惑:

char arr[3]; // array of 3 chars.

char *arr[3]; // array of 3 pointers to char.

在main()中,您应该只写char *arr;

答案 1 :(得分:2)

嗯......此代码中有几个错误。让我们从编译器抱怨的最明显的开始:

char *arr[3];

此行声明arr是一个包含三个指针char的数组。从函数返回的是指向char - >的单个指针。不匹配。

下一步:

static char arr[3];
sprintf(arr, "%s\n", "abc")

在这里预订3 char s。 sprintf()会写5 char。 {em>字符串文字 %s中的3个字符替换"abc"。您添加换行符,然后添加0作为"字符串"结尾的标记。制作5.这个btw是未定义的行为。你写过数组的末尾。像这样的代码可以编译,但是根本不保证在运行时会发生什么。

在此处执行剪切。您应该阅读C中的数组和指针。如果您正在阅读的文本声称它们是相同的......请停在那里并找到更好的文本。他们不是。

我将在此简要解释一下,因此它适用于 Q& A 风格。

C中的数组确实是几个值的连续空间。 char arr[3]表示包含3 char s。

的变量

另一方面,char *只是一个指向char的指针 - 这个可能是数组的第一个元素。

在C中,您不能将数组作为函数参数传递,并且您无法从函数返回数组。尝试这样做会导致隐式转换:实际传递的 是指向该数组的第一个元素的指针。

我认为缺少的最后一点信息是C中的字符串文字:它是一个数组(匿名,例如,它没有名字)包含双引号中的所有字符加上附加00标志着"字符串"的结束。在C.

在表达式中,字符串文字计算为指向第一个元素的指针。

所以,像这样:

char *foo = "bar";

将导致foo指向数组的b。这就像写作

static const char no_name_0[] = { 'b', 'a', 'r', 0 };
char *foo = &(no_name_0[0]);

答案 2 :(得分:1)

首先,char arr[3];太过于无法存储"abc\n"。它必须至少包含5个元素,包括终止空字符。

然后,char *arr[3];char*的3元素数组 您应该将makeArr()的返回值(具有char*类型)分配给arr[0]或其他元素,或者您应该更改arrmain的类型函数为char*,与makeArr()的返回值类型相同。

此外,此makeArr()不会生成任何数组并返回(指向)现有数组。 Yoy应该使用malloc()来“制作数组”。

<强>更新

将值char*赋值给数组char arr[10];在C中似乎无效。 您应该使用strcpy()strncpy()(比strcpy()更安全)来复制数组中存储在数组中的字符串。

答案 3 :(得分:0)

将数组作为参数传递并在被调用函数中修改它会更容易。如果您正在静态创建数组并且不需要分配内存,请不要只是通过引用传递指向要修改的函数的指针

void makeArr(char arr[]){
    sprintf(arr, "%s\n", "abc");
}

只需将现有的声明数组传递给makeArr函数...

int main(int argc, char *argv[]) {
  char arr[10];
  makeArr(arr);
  return 0;
}

答案 4 :(得分:0)

您无法将makeArr的结果分配给arr。我想这是你的投射错误。过度简化,arr指向堆栈上分配10个字符数组的位置。所以,我会传递arr将makeArr作为char *。所以,你最终会得到这样的东西:

#include <stdio.h>
char * makeArr(char *arr)
{
    sprintf(arr, "%s\n", "abc");
    return arr;
}

int main(int argc, char *argv[])
{
    char arr[10];

    makeArr(arr);
    printf("%s\n", arr);
    return 0;
}