我无法弄清楚如何将整数值分配给 C 中的字符串数组,假设这当然是可能的!我想将一些元素从 char ** 更改为不同的值,然后将它们重新分配到数组中的初始位置。 实际上,我有两个元素,“Mon”和“Aug”,我想将其变为“01”和“08”...... 所以我尝试了一些但没有成功:
char *time_array[7] = {"45", "55", "11", "Mon", "29", "Aug", "2022"};
uint32_t day2convert = 1;
uint32_t month2convert = 8;
*time_array[3] = &day2convert; // not even with a cast (char) which gave same results
*time_array[5] = &month2convert;
for (j = 0; j < 7; ++j)
printf("after conversion : %s\n", time_array[j]);
/*
这两个元素的结果在每次主调用时都不同,因为我随机选取不同内存分配中存在的值(可能)。 Es。 Don,hug; 4on8ug,tonxug... 此外,我还尝试使用 strcpy 函数:
strcpy(time_array[3], &day2convert); //also with a cast (char)(&day2convert)
但我仍然检索到一个空字符串。
因此,我温和地询问是否有一种方法可以原则上完成我想要的事情,但也要求一些有关字符串数组的解释。因为我了解到 char ** 是一个指针数组,所以为它分配一个值应该是正确的 *array[ii] = &var (???寻找确认)
...如何将整数值赋给字符串数组(?)
time_array[]
不是字符串 的数组。它是一个指向strings的指针数组。这种区别很重要,因为字符串的生命周期需要仔细考虑。这里,time_array[i]
指向的strings不是确定性可修改的。
char *time_array[7] = {"45", "55", "11", "Mon", "29", "Aug", "2022"};
我们可以通过重新分配一个复合文字来更改指针。很容易形成一个像 integer 这样的字符串,其中包含 1-7 这样的单个数字值。然而,复合文字的生命周期仅持续到代码块的末尾。
int day_index = 1;
time_array[3] = (char[3]){ '0', '0' + day_index, '\0'}; // , '\0' optional as rest is zero filled
// good for a while
或者也许制作
time_array[]
一个字符串数组,然后重新分配索引字符串。
char time_array[7][5] = {"45", "55", "11", "Mon", "29", "Aug", "2022"};
int day_index = 1;
strcpy(time_array[3], (char[3]){ '0', '0' + day_index });
// or
snprintf(time_array[3], sizeof time_array[3], "%02d", day_index);
// good indefinitely
您需要将每个 7 天的名称转换为其序数。
我写了这个“哈希函数”,用于快速返回
1
到 7
,将 "Sun"
到 "Saturday"
(它只需要名称的前两个字符,并且不区分大小写)。
它会返回误报,但允许您仅针对一个可能的日期名称测试您拥有的字符串。如果函数返回
2
,则可以将字符串检查为 "Tu"
、"TUE"
或 "Tuesday"
的变体。您不必检查其他六天名称的可能性。
返回
0
表示它不是工作日名称。
// Convert a day name (or 3 letter abbrev.) to index (1-7, Sun=1). Beware false positives!
int wkdayOrd( char cp[] ) { return "65013427"[*cp/2 + ~cp[1] & 0x7] & 0x7; }
如果您小心地将引用字符串中的
2
替换为 1
,将 3
替换为 2
,将 4
替换为 3
等,它将根据您的需要返回 Mon=1
和 Sun=7
。 ..
对于月份名称
"Jan"
到 "December"
(需要 3 个字母)到 1
到 12
。同样,这是一个“哈希函数”,其他单词可能/将导致“误报”,必须仅针对一个正确的月份名称字符串进行确认。
int monthOrd( char cp[] ) { return "DIE@CB@LJF@HAG@K"[ cp[1]/4&7 ^ cp[2]*2 &0xF ] &0xF; }
尝试一下,让我们知道它是否可以帮助您实现您想要的目标。
演示功能,这里是一个满足OP问题的例子。 LUT 值已调整,以便
"Mon(day)"
为日 1
。
这会在不调用
sprintf()
的情况下进行转换(信任源字符串)。printf()
仅用于“诊断测试”。
static int monthOrd( char cp[] ) { return "DIE@CB@LJF@HAG@K"[ cp[1]/4&7 ^ cp[2]*2 &0xF ] &0xF; }
static int wkdayOrd( char cp[] ) { return "54072316"[*cp/2 + ~cp[1] & 0x7] & 0x7; }
static char *toDigitStr( int val ) { // successive calls overwrite result
static char buf[3];
buf[0] = (char)('0' + val/10);
buf[1] = (char)('0' + val%10);
buf[2] = '\0';
return buf;
}
int main( void ) {
char *dayName = "Mon";
printf( "%s ==> %s\n", dayName, toDigitStr( wkdayOrd( dayName ) ) );
char *mthName = "Aug";
printf( "%s ==> %s\n", mthName, toDigitStr( monthOrd( mthName ) ) );
mthName = "DECEMBER";
printf( "%s ==> %s\n", mthName, toDigitStr( monthOrd( mthName ) ) );
return 0;
}
输出:
Mon ==> 01
Aug ==> 08
DECEMBER ==> 12