请考虑以下代码。我要问的是,如果这是正确的,是否有什么遗漏。还有别的办法可以做吗。
#include <stdio.h>
#include <string.h>
const char *getOrder (const char *day)
{
if (strncmp(day, "Monday", 7) == 0) {
return "first";
} else if (strncmp(day, "Tuesday", 7) == 0) {
return "second";
} else if (strncmp(day, "Wednesday", 9) == 0) {
return "third";
} else if (strncmp(day, "Thursday", 8) == 0) {
return "forth";
} else if (strncmp(day, "Friday", 6) == 0) {
return "fifth";
} else if (strncmp(day, "Saturday", 8) == 0) {
return "sixth";
} else if (strncmp(day, "Sunday", 6) == 0) {
return "seventh";
} else
return NULL;
}
int main()
{
const char* str = NULL;
str = getOrder ("Monday");
printf("str : %s\n", str);
return 0;
}发布于 2022-07-26 22:21:02
if/else梯子过于复杂,容易出现“复制/粘贴”错误。
似乎您需要一个“查找表”来将一个工作日的名称转换为一个不同的字符串。
const char *getOrder (const char *day) {
char *LUT[][2] = {
{ "Monday", "first", },
{ "Tuesday", "second", },
{ "Wednesday", "third", },
{ "Thursday", "forth", },
{ "Friday", "fifth", },
{ "Saturday", "sixth", },
{ "Sunday", "seventh", },
};
for( i = 0; i < sizeof(LUT)/sizeof(LUT[0]); i++ )
if( strncmp(day, LUT[i][0], strlen( LUT[i][0] ) ) == 0 )
return LUT[ i ][ 1 ];
return "NOT A DAY NAME";
}它还在反复搜寻..。
下面是一个很小的散列函数,用于快速将字符串日期名称转换为整数值(大小写不敏感)。玩玩它。也许你会试着把这个调整成合理的平日名称。
// Convert a day name (or 3 letter abbrev.) to index (1-7, Sun=1). Beware false positives!
static int wkdayOrd( char cp[] ) { return "65013427"[*cp/2 + ~cp[1] & 0x7] & 0x7; }发布于 2022-07-26 13:44:42
决定您是否必须释放的不是变量的类型,而是它驻留在内存的哪一部分。
如果使用malloc或相关函数分配内存,则内存将位于堆上,因此必须对它们调用free。
在您的示例中,这些字符串是在静态存储器中创建的(不是按照其中一个注释中的建议从堆栈中创建的,否则在函数返回时不能使用它,因为它们本来会被覆盖)。
这些字符串被编译成运行时二进制本身(您可以运行strings <your binary>并看到它们)。一旦程序被加载,内存中的一个特殊区域将被保留给这样的常量数据,因此您不需要释放它。
另外,您必须从右到左读取C/C++类型,所以类型const char*意味着您有一个指向常量字符串的指针。这意味着您不能修改它所指向的字符串,但它没有说明如何分配这个指针后面的内存。它可能在堆上,在堆栈上,或者在静态内存上,只是类型不会告诉您。
发布于 2022-07-26 14:14:48
结论是否定的。
原因是free()应该用作malloc()、calloc()或realloc()的合作伙伴。或者说,那些alloc函数只返回一个指针,那么它是否可以由free()回收。
一个附加的原因是,您在代码中编写的所有字符串都分配在.rodata节中,这意味着这些字符串加载在内存空间中,您不能编辑而只能读取,所以即使存在释放它们的方法,您仍然不能使用内存空间。
https://stackoverflow.com/questions/73124321
复制相似问题