如何用数字初始化 char 类型的全局一维数组?

Posted

技术标签:

【中文标题】如何用数字初始化 char 类型的全局一维数组?【英文标题】:How can I Initialize a global 1D array of type char with a number? 【发布时间】:2022-01-17 20:08:21 【问题描述】:

使用您的 ID(5 位数字)初始化一个 char 类型的全局一维数组“StudentData”。 在本部分中必须使用指针语法。 你能给我一些关于这样做的提示吗?

我试过这样做,

char *StudentData;
void loadData()
        StudentData=(char*)"60897";

是正确的还是我应该尝试做其他事情?

【问题讨论】:

char *StudentData 是一个指针,而不是一个数组。 “这部分必须使用指针语法。”那么你想要一个数组还是一个指针?你需要选择一个。数据应该是读/写还是只读? 不需要演员表。除此之外,请记住,C 中的所有文字字符串实际上都是字符数组(包括空终止符),并且虽然这些数组不是常量,但您不能修改它们的内容。这就是为什么建议使用 const char * 来指向文字字符串的原因。 至于数组与指针的关系,您还必须记住(或了解)所有数组都可以衰减到指向其第一个元素的指针。并且对于所有数组和指针,数组索引将使用指针算法完成(对于任何数组或指针p 和索引i,表达式p[i] 完全等于*(p + i))。 @Someprogrammerdude 在所有 C 语言中,隐式指针衰减是我认为的一个设计缺陷。它不会使开发变得更糟,实际上稍微容易一些,但它使学习语言变得更加困难。这不值得。 【参考方案1】:

您可能想要以下内容:

#include <string.h>  //This header has strcpy()

#define ENOUGH_DIGITS   5 //This is so you can easily modify ID length in the future

char StudentData[ENOUGH_DIGITS+1];  //Global array 1 bigger than the longest string

void loadData()
   //Ask the compiler to put a read-only string somewhere in the data memory
   const char *myID = "60897";  
   //Copy the read-only string into the global array
   strcpy(StudentData,myID);

【讨论】:

【参考方案2】:

虽然您确实使用了一个数组(字符串文字实际上是一个),但它是一个匿名 - 而您的studentData 只是一个指向该数组的指针。

一个全局一维数组“StudentData”

我宁愿将其解释为您打算拥有一个具有该名称的真正数组,因此看起来像:

char studentData[N];

其中N 是一个常量表达式,表示您的数组的适当大小,至少为 5,因为您需要能够存储 5 位数字 - 如果您的 ID 应该表示为 C 字符串,则可能为 6(这样需要一个额外的字符持有强制性的空终止符!),或者你立即使用 2 的幂(最少 8 个)。

这部分必须使用指针语法。

所以你需要一个指向该数组的指针:

char* ptr = studentData;

您现在可以只使用指针将值分配给:

*ptr++ = '0'; // dereferences the pointer, assigns a value to (in this
              // case a character representing the digit zero) and
              // increments it afterwards to point to the next character

// repeat this for the next four digits!

*ptr++ = 0; // terminating null character (note: no single quotes)
// or:
*ptr = 0;
// it's up to you to decide if incrementing yet another time actually
// is meaningful (first variant) or unnecessary (second variant)...

如果没有进一步的要求,您可以将这段代码直接放在 main 函数中,或者将它放在另一个从 main 调用的函数中,例如:

void loadData(size_t size, char data[size])

    // ideally size check with appropriate error handling

    // assignment as above


// in main:
loadData(sizeof(studentData), studentData);

注意:对于 函数参数,所有 char* datachar data[]char[someArbitrarySize] 都是等效的,如果给定任何大小,它就会被忽略——我们仍然可以添加它以用于文档目的,在上面的签名中:告诉我们需要一个大小为(至少)size 的数组。还要注意,如果给定多个维度,这仅适用于 最外层 维度!

【讨论】:

【参考方案3】:

一维数组“学生数据”

不不不。 StudentData 不是一个数组,它是一个指针。数组是内存块,而指针是内存地址,它可能是也可能不是数组。数组有时会变成指针,这叫衰减。

"60897" 已经与char * 兼容。您可以直接将其分配给StudentData。像这样:

StudentData = "60897";

如果要使用数组,请执行以下操作:

#include <string.h>
char StudentData[WHATEVER_IS_ENOUGH_TO_HOLD_THE_DATA]; /* allocate array.
 make sure that the size of the array accounts for the null 
terminating character. */
void loadData()
        strcpy(StudentData, "60897"); //you can't directly assign to an array.

【讨论】:

以上是关于如何用数字初始化 char 类型的全局一维数组?的主要内容,如果未能解决你的问题,请参考以下文章

一维数组和二维数组

C语言中怎么把一维数组初始化都为0,

如何用一行代码初始化字符串类型的数组?

作业九 总结

如何用postman将一维int数组

如何用python实现图像的一维高斯滤波