我希望有人能澄清我做错了什么。我试图在C中复制strcpy函数。
这个练习要求我们通过一个src字符串创建两个循环,并替换目标字符串中每个对应索引的内容。我的问题是,当我在int main()中创建测试函数时,我初始化了一个字符数组并为其分配了一些内容。它编译得很好,但我得到了一个norminette错误:
// Method 1
char str1[5] = "abcde";// Error: DECL_ASSIGN_LINE Declaration and assignation on a single line
char str2[5] = "fghij"; //Error: DECL_ASSIGN_LINE Declaration and assignation on a single line
如果我像下面这样初始化和赋值,Norminette是可以的,但是我会得到一个编译错误:
第一次
我也尝试过各种方法,包括str[5] =“abcde”,但都没有成功。我的问题是如何声明这些字符数组,以满足norminette和编译器的要求?
另外,我的理解是,在C语言中,字符数组和字符串是可以互换的概念吗?谢谢
2条答案
按热度按时间8wigbo561#
在方法2中:
是 * 赋值 *,因此无效。
[]
语法只能在 * 定义 * 中使用。下面将详细介绍。方法3是好的。不管是谁在标记这个都是错的。
在方法1 [和其他地方]中:
是错误的,因为它应该是:
以说明结尾处的EOS(0x00)字符串终止符。
另一种方法是:
而且,您在方法3中[或多或少]做到了这一点:
AFAICT,这是由外部工具(* 不是 * 编译器?)标记的。这是一个完全有效的替代方案。
bvn4nwqk2#
还有我的理解是,在C中,字符数组和字符串是可以互换的概念吗?
不可以。在C语言中,string 是一个字符值序列,包括一个0值终止符。字符串
"abcde"
可以用序列{'a', 'b', 'c', 'd', 'e', 0}
表示。该终止符是各种字符串处理例程(如strlen
和strcpy
)知道字符串结束位置的方法。字符串(包括
"abcde"
之类的字符串文字)* 存储 * 在字符类型的数组中,但不是每个字符类型的数组都存储字符串-它可能是没有0值终止符的字符序列,也可能是包含多个0值字节的字符序列。为了存储N个字符的字符串,数组必须 * 至少 * N+1个元素宽:
你可以声明数组而不需要显式的大小,并且大小(包括终止符的+1)将由初始化器的大小决定:
我找到了documentation for Norminette和...
我知道你们学校希望每个人都遵循一个共同的编码标准;这使得它更容易分析和评分每个人的代码。但它的一些规则只是简单的 * 怪异 * 和非惯用的,具有讽刺意味的是,鼓励不良风格。如果我的解释是正确的,它希望你写你的初始化器
或者是同样奇怪的事没人会这么做。
解决此问题的一种方法是不在声明中初始化数组,而是使用
strcpy
单独对其赋值:不能使用
=
在声明之外对整个数组赋值(初始化和赋值不是一回事)。作为陈述。
要么使用
strcpy
或strncpy
(用于字符串)或memcpy
(用于非字符串)这样的库函数,要么单独为每个元素赋值: