解析华为C语言面试题:字符串与数组错误

需积分: 3 6 下载量 54 浏览量 更新于2024-09-18 收藏 232KB PDF 举报
"这篇文档是关于重解几道华为经典C语言面试题的,主要涉及字符串操作和数组管理的问题,包括strcpy和strlen函数的正确使用。" 在这篇文档中,作者列举并分析了三道华为C语言面试题,旨在考察面试者对C语言基础知识的理解,特别是字符串和字符数组的操作,以及相关函数的运用。 1. 题目1: ```c void test1() { char string[10]; char* str1="0123456789"; strcpy(string, str1); } ``` 这个例子中,`string` 数组只有10个字符的空间,但`str1` 指向的字符串包含10个可见字符和一个结束符`\0`,总共11个字符。使用`strcpy`时,如果目标数组不足以容纳源字符串,就会导致越界。因此,正确使用`strcpy`时,目标数组大小必须大于源字符串的长度。 2. 题目2: ```c void test2() { char string[10], str1[10]; for(i=0; i<10; i++) { str1[i]='a'; } strcpy(string, str1); } ``` 此例中,除了未定义变量`i`,更严重的问题是`str1`没有添加字符串结束符`\0`。`strcpy`需要依赖结束符来确定何时停止复制,因此在`for`循环结束后应添加`str1[9]='\0';`以形成有效的字符串。 3. 题目3: ```c void test3(char* str1) { char string[10]; if(strlen(str1)<=10) { strcpy(string, str1); } } ``` 这里,`strlen(str1)`返回的是不包括结束符的字符串长度。如果条件是`<=10`,当`str1`恰好是10个字符时,加上结束符`\0`,就会导致`strcpy`过程中发生越界。正确的比较应该是`<10`,确保有足够的空间容纳结束符。 通过这三个问题,我们可以看到: - 字符数组和字符串之间的区别:字符串通常会在末尾自动添加结束符`\0`。 - 使用`strcpy`时,务必确保目标数组足够大以容纳源字符串,包括其结束符。 - `strlen`函数计算的是字符串的长度,不包括结束符`\0`,在使用时需考虑这一点。 这些问题不仅考察了基本的C语言语法,还强调了对内存管理和安全性的理解,这些都是在实际编程中避免错误和潜在安全风险的关键。在准备华为或其他公司的C语言面试时,对这些基础概念的深入理解和熟练应用是非常重要的。