gpt4 book ai didi

c - 确定数组的长度以提高内存效率

转载 作者:太空宇宙 更新时间:2023-11-04 00:26:31 25 4
gpt4 key购买 nike

用 C 语言写一个函数:

  • 将存储在字符串中的句子作为其唯一参数(例如,“这是一个短句。”)。
  • 返回一个字符串,其中包含每个单词中的字符数(包括标点符号),数字之间用空格隔开。 (例如,“4 2 1 5 9”)。

我写了下面的程序:

 int main()    
{
char* output;
char *input = "My name is Pranay Godha";
output = numChar(input);
printf("output : %s",output);
getch();
return 0;
}


char* numChar(char* str)
{
int len = strlen(str);
char* output = (char*)malloc(sizeof(char)*len);
char* out = output;
int count = 0;

while(*str != '\0')
{
if(*str != ' ' )
{
count++;
}
else
{

*output = count+'0';
output++;
*output = ' ';
output++;
count = 0;

}
str++;
}
*output = count+'0';
output++;
*output = '\0';
return out;
}

我只是想知道我正在为输出字符串分配 len 内存量,我觉得这超出了我应该分配的内存量,因此存在一些内存浪费。您能告诉我如何做才能提高内存效率吗?

最佳答案

我看到很多小 bug 。如果我是您的讲师,我会给您的解决方案评分为“C-”。这里有一些关于如何将其变成“A+”的提示。

 char* output = (char*)malloc(sizeof(char)*len); 

上述行的两个主要问题。对于初学者来说,您忘记了“释放”您分配的内存。但这很容易被原谅。

真正的错误。如果您的字符串只有 1 个字符长(例如“x”),您将只分配一个字节。但是您可能需要将两个字节复制到字符串缓冲区中。一个“1”后跟一个以空结尾的“\0”。最后一个字节被复制到无效内存中。 :(

另一个错误:

*output = count+'0'; 

当“计数”大于 9 时会发生什么?如果“count”为 10,则 *output 会分配一个冒号,而不是“10”。

首先编写一个只计算字符串中单词数的函数。将此函数的结果分配给变量调用 num_of_words。

由于您的单词很可能超过 9 个字符,因此有些单词将有两个或更多数字用于输出。并且您需要考虑每个数字之间的“空格”。并且不要忘记尾随的“空”字节。

如果您考虑一个 1 字节无符号整数在字符串表示形式 ('0'..'255') 中最多可以有 3 个字符的情况,不包括空字符或负数,则 sizeof(int )*3 是对整数表示(不包括空字符)的最大字符串长度的合理估计。因此,您需要分配的内存量是:

 num_of_words = countWords(str);
num_of_spaces = (num_of_words > 0) ? (num_of_words - 1) : 0;
output = malloc(num_of_spaces + sizeof(int)*3*num_of_words + 1); // +1 for null char

因此这是一个相当不错的内存分配估计,但它肯定会在所有情况下分配足够的内存。

我认为您的程序中还有其他一些错误。对于初学者,如果每个单词之间有多个空格,例如

"my     gosh"

我希望您的程序打印“2 4”。但是您的代码打印了其他内容。如果您的字符串中有前导或尾随空格,则可能存在其他错误。并且内存分配估计不考虑您在这些情况下插入的额外垃圾字符。

更新:

鉴于您在下面的回答中坚持并尝试做出更好的解决方案,我将给您一个提示。我写了一个打印字符串中所有单词长度的函数。它实际上并不分配一个字符串。它只是打印它——就好像有人在你的函数要返回的字符串上调用了“printf”。你的工作是推断这个函数是如何工作的——然后修改它以返回一个新的字符串(包含所有单词的整数长度)而不是仅仅打印它。我建议您修改此函数中的主循环以保持总字数统计。然后分配一个缓冲区大小 = (word_count * 4 *sizeof(int) + 1)。然后再次循环输入字符串,将每个单词的长度追加到您分配的缓冲区中。祝你好运。

void PrintLengthOfWordsInString(const char* str)
{
if ((str == NULL) || (*str == '\0'))
{
return;
}

while (*str)
{
int count = 0;

// consume leading white space
while ((*str) && (*str == ' '))
{
str++;
}

// count the number of consecutive non-space chars
while ((*str) && (*str != ' '))
{
count++;
str++;
}

if (count > 0)
{
printf("%d ", count);
}
}
printf("\n");
}

关于c - 确定数组的长度以提高内存效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8983708/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com