面试点:字符串strcpy函数(C语言面试题分析之二)

简介: 面试点:字符串strcpy函数 C语言面试题分析之二 一.基本知识点 Strcpy(字符数组1,字符串2) 1.strcpy该函数是通过第二个参数的字符串的结束符来判断是否拷贝结束的; 2.

面试点:字符串strcpy函数

C语言面试题分析之二

一.基本知识点

Strcpy(字符数组1,字符串2)

1.strcpy该函数是通过第二个参数的字符串的结束符来判断是否拷贝结束的

2.strlen函数得到字符串的长度,是不包含字符串结束符的

3.使用strcpy函数的时候,一定要注意第一个字符数组的大小至少不小于字符串2的大小,否则便是访问越界

4.字符串2后面的`\0`也一同被复制到字符数组1中;

二.程序错误分析

程序片段一:

void test1()
  
{
  
       char string[10];
  
       char* str1="0123456789";
  
       strcpy(string, str1);
  
}
  这里string数组越界,因为str1字符的长度是10,还有一个结束符‘/0’。所以总共有11个字符长度。而string数组大小为10,所以就越界了。

  PS:使用strcpy函数的时候一定要注意前面目的数组的大小一定要大于后面字符串的大小,否则便是访问越界。

程序片段二:

void test2()
  
{
         char string[10], str1[10];

int i;
  
for(i=0; i<10;i++)
  
{
  
str1[i] ='a';
  
}
  
strcpy(string, str1);
}
  这里最大的问题还是str1没有结束符,因为strcpy的第二个参数应该是一个字符串常量。该函数就是通过判断第二个参数的结束符来判断是否拷贝结束的。所以在for循环后面应加上
str1p[9] = '/0';
  PS:字符数组和字符串的最明显的区别就是字符串会被默认的加上结束符‘/0’

程序片段三

  void test3(char* str1)
  
{
  
       char string[10];
  
       if(strlen(str1)<=10)
  
       {
  
              strcpy(string, str1);
  
       }
  
}
  这里的问题仍是越界问题。strlen函数得到字符串的长度,是除结束符之外的。如果str字符串的长度正好等于10的话,就很明显越界了。

相关文章
|
12天前
|
程序员 C语言
C语言库函数 — 内存函数(含模拟实现内存函数)
C语言库函数 — 内存函数(含模拟实现内存函数)
24 0
|
12天前
|
程序员 C语言 开发者
C语言库函数 — 字符串函数(含模拟实现字符串函数)
C语言库函数 — 字符串函数(含模拟实现字符串函数)
35 0
|
15天前
|
C语言
【C语言】字符串函数strcpy&&strcat&&strcmp&&strstr的使⽤和模拟实现2
【C语言】字符串函数strcpy&&strcat&&strcmp&&strstr的使⽤和模拟实现
|
19天前
|
存储 C语言
【我爱C语言】详解字符函数isdigit和字符串转换函数(atoi和snprintf实现互相转换字符串)&&三种strlen模拟实现1
【我爱C语言】详解字符函数isdigit和字符串转换函数(atoi和snprintf实现互相转换字符串)&&三种strlen模拟实现
|
19天前
|
机器学习/深度学习 C语言
【C语言】函数的系统化精讲(三)1
【C语言】函数的系统化精讲(三)
|
19天前
|
编译器 C语言
【C语言】函数的系统化精讲(一)2
【C语言】函数的系统化精讲(一)2
|
19天前
|
编译器 Serverless C语言
【C语言】函数的系统化精讲(一)1
【C语言】函数的系统化精讲(一)
|
19天前
|
C语言
【C语言】第三回 关于字符串,语句和注释的使用2
【C语言】第三回 关于字符串,语句和注释的使用
|
19天前
|
存储 程序员 编译器
【C语言第二回】main、printf和库函数
【C语言第二回】main、printf和库函数
|
23天前
|
编译器 C语言 C++
【C语言】calloc()函数详解(动态内存开辟函数)
【C语言】calloc()函数详解(动态内存开辟函数)
25 0