Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C、 数组,如何使用strlen_C_Arrays_Memory Management - Fatal编程技术网

C、 数组,如何使用strlen

C、 数组,如何使用strlen,c,arrays,memory-management,C,Arrays,Memory Management,我正在编写一个简单的程序,希望使用strlen函数来获得所讨论字符串的大小 然后我想创建一个数组,例如testarray[strlen(somestring)] 但它无法编译,错误为“错误:可变大小的对象可能未初始化” 然而,这个字符串的长度不会改变,所以我想我必须告诉我的机器 我只能访问这些标题 stdio.h 字符串.h 如果有人能投下一些知识炸弹,那就太好了。:) 编辑: 我错了可以编译,但testarray[strlen(somestring)]={}不能。用testarray[strl

我正在编写一个简单的程序,希望使用strlen函数来获得所讨论字符串的大小

然后我想创建一个数组,例如testarray[strlen(somestring)]

但它无法编译,错误为“错误:可变大小的对象可能未初始化”

然而,这个字符串的长度不会改变,所以我想我必须告诉我的机器

我只能访问这些标题

stdio.h 字符串.h

如果有人能投下一些知识炸弹,那就太好了。:)

编辑: 我错了可以编译,但testarray[strlen(somestring)]={}不能。用testarray[strlen(somestring)]如果我尝试使用垃圾,我就有垃圾

谢谢大家,它现在正在与memset合作

最好使用“malloc()”

char*testarray=(char*)malloc(strlen(somestring)+1)

如果你在C++中编程,我鼓励你使用向量。< /P> C99引入了“可变长度数组”,但它们不能移植到所有C编译器。就我个人而言,我不鼓励你使用它们

剩下的是“malloc()”;)


而且,nhahtdh是非常正确的,请确保始终执行相应的“free()”

您需要将temp中的内存初始化为0。这是空括号
{}
在原始代码中所做的。或者使用memset

memset(temp, 0, sizeof(temp));
或者for循环(因为没有malloc/free,所以可能没有memset)

int length=sizeof(temp);
int i;
对于(i=0;i
testarray[strlen(somestring)]={}

无法进行上述初始化。因为字符串大小将动态计算(可能会变化)。对于静态数组初始化,我们应该提供数组的确切大小

您可以使用“memset”初始化动态数组。

我希望这有帮助

#include <stdio.h>
#include <string.h>

int main(int argc, const char * argv[])
{
    char array[256];
    printf ("Enter a sentence: ");
    fgets(array, 256, stdin);
    printf ("The sentence entered is %zu characters long.\n", strlen(array));
    return 0;
}
#包括
#包括
int main(int argc,const char*argv[]
{
字符数组[256];
printf(“输入一个句子:”);
fgets(阵列,256,标准输入);
printf(“输入的句子长度为%zu个字符。\n”,strlen(数组));
返回0;
}

strlen
将返回从起始指针到最近字符(NUL character,0)的字符数。它不会返回缓冲区/数组的大小。事实证明,这是的副本。我认为,如果
somestring
在编译时保持不变,大多数现代编译器将允许变量数组初始化。谢谢,但malloc似乎不在这两个库中。如果我像这样写char temp[strlen(str)+1];它可以编译,但里面似乎有垃圾,如果我想写chartemp[strlen(str)+1]={};我无法编译。@user1801930:
malloc
在C标准库中。如果不提供,C实现就不可能完成。可以在
stdlib.h
中找到它。此外,您的代码片段没有意义,这就是它无法编译的原因。你打算干什么?这些头文件不是“库”,但是如果您不能使用
malloc
(确定吗?),并且您没有允许可变长度数组的C99实现,那么您需要预先分配一个最大大小的数组。此外,@palsm4,不要强制转换
malloc
的返回值,即使VLA是通用的,使用它将是一个非常糟糕的主意,因为无法知道是否有足够的空间来存储大型VLA,也无法让实现报告失败。对不起,我以为它们被称为库。在C99中,可以使用可变长度数组。这些是数组类型,其大小在运行时确定。
#include <stdio.h>
#include <string.h>

int main(int argc, const char * argv[])
{
    char array[256];
    printf ("Enter a sentence: ");
    fgets(array, 256, stdin);
    printf ("The sentence entered is %zu characters long.\n", strlen(array));
    return 0;
}