将整数赋给 C 中的单元素字符串数组

问题描述 投票:0回答:2

我无法弄清楚如何将整数值分配给 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。 Donhug4on8ugtonxug... 此外,我还尝试使用 strcpy 函数:

strcpy(time_array[3], &day2convert);   //also with a cast (char)(&day2convert)

但我仍然检索到一个空字符串。

因此,我温和地询问是否有一种方法可以原则上完成我想要的事情,但也要求一些有关字符串数组的解释。因为我了解到 char ** 是一个指针数组,所以为它分配一个值应该是正确的 *array[ii] = &var (???寻找确认)

arrays c string pointers arrayofstring
2个回答
1
投票

...如何将整数值赋给字符串数组(?)

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

1
投票

您需要将每个 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
© www.soinside.com 2019 - 2024. All rights reserved.