0
点赞
收藏
分享

微信扫一扫

C项目开发常见问题集合

彩虹_bd07 2022-05-03 阅读 146
c语言

文章目录

1、如何给结构体中的字符数组赋值

在了解给结构体字符数组赋值之前,先了解一下字符数组这个东西
例如:

(1)定义并对字符数组初始化

定义一个字符数组,不赋值初始化:

char	a[10];

定义一个字符数组,并初始化:

char	a[10] = "hello";

定义一个字符数组,对每个元素逐个赋值:

char	a[10] = {'h', 'e', 'l', 'l', 'o'};

上面三种方法都是正确的,但是我们很多时候会像下面这样,先定义再赋值,但是这是错误的,编译系统也会报错,例如:

错误1:

char	a[10];
a[10] = "hello";

编译提示:
在这里插入图片描述
原因:a[10] = “hello”;表达式中,欲将"hello"字符串的首地址赋值给a[10],而字符数组a每个元素存储的是字符,就是ASII码对应的数值,也就是整数,这就是为什么提示,将一个指针赋值给一个整数没有强制转换。而且a[10]只是数组a的一个元素,一个字符怎么能容纳一个字符串?明显不对。

错误2:

char	a[10];
a = "hello";

原因:这种情况也是很离谱的,而且不容易发现。在执行第一条语句,char a[10];表达式的时候,系统开辟的一段内存给了字符数组a[10], 所以一开始a代表的是字符数组a[10]内存空间的首地址,即a指向字符数组a[10]的首地址;执行第二条表达式a = “hello”;后,a不再指向字符数组a[10]内存空间的首地址,而是字符串常量"hello"的首地址,这时指针a出现指向混乱,不允许!

但是如果一开始定义了一个字符数组,并没有初始化,后面用到的时候再赋值,那应该怎么办呢?
可以利用strcpy()和strncpy()函数:

char	a[10];
strcpy(a,"hello");

(2)如何对结构体的字符数组赋值

其实就是用上面的strcpy()和strncpy()函数

C 库函数 strcpy()

char *strcpy(char *dest, const char *src) 

把 src 所指向的字符串复制到 dest。需要注意的是如果目标数组 dest 不够大,而源字符串的长度又太长,可能会造成缓冲溢出的情况.

C 库函数strncpy()

 char *strncpy(char *dest, const char *src, size_t n) 

把 src 所指向的字符串复制到 dest,最多复制 n 个字符。当 src 的长度小于 n 时,dest 的剩余部分将用空字节填充。
实例:

#include <stdio.h>
#include <string.h>

typedef struct student_s{
    char name[64];
    int grade;
}student_t;

int main()
{
    student_t student;

    memset(&student, 0, sizeof(student));
    //strcpy(student.name, "zcx");
    strncpy(student.name, "zcx", strlen("zcx"));
    student.grade = 99;

    printf("name:%s, grade:%d, strlen(\"zcx\"):%ld\n", student.name, student.grade, strlen("zcx"));

    return 0; 
}

2、strlen和sizeof求字符串长度的区别

1.sizeof会将空字符\0计算在内,而strlen不会将空字符\0计算在内。

2.sizeof是操作符(关键字),它结果类型是size_t,它在头文件中typedef为unsigned_int类型。 strlen是函数。

3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以’‘\0’'结尾的。
4.数组做sizeof的参数不退化,传递给strlen就退化为指针了。

sizeof()的功能是计算一个数据类型的大小,这个类型可以是数组、函数、指针、对象等,单位为字节,它的返回值是size_t类型,也就是unsigned int类型,是一个无符号整数。注意:sizeof不是一个函数,它是一个运算符,所以它不需要包含任何头文件。

strlen()的功能是计算一个指定字符串的长度,函数原型如下:

size_t	strlen(const char *s)

它的返回值是size_t类型,也就是unsigned int类型,返回的是字符串的长度,需要包含头文件#inlude <string.h>,参数s是字符串首地址。

size_t:size_t 是为了方便系统之间的移植而定义的,在32位系统上定义为 unsigned int,在64位系统上定义为 unsigned long int。

3、字符串转换为int或float

atoi 是把字符串转换成int型的函数,其函数参数是一个字符串,如果字符串的的开始字符为空格则跳过再做转换,如果第一个非空格字符存在,是数字或者正负号则开始做类型转换,之后检测到非数字(包括结束符 \0和.) 字符时停止转换,返回整型数。否则,返回零。

#include <stdlib.h>
#include <stdio.h>
 
int main(void)
{
    int i1, i2;
    float f1, f2;
    char* str1 = "25.5";//注意:atoi和atof遇到.就停止往后转换了
    char* str2 = "25.5a";

    i1 = atoi(str1);
    i2 = atoi(str2);

    f1 = atoi(str1);
    f2 = atoi(str2);

    printf("str1=%s,str2= %s\n",str1, str2);
    printf("i1=%d, i2=%d\n", i1, i2);
    printf("f1=%f, f2=%f\n", f1, f2);
    
    return 0;
}

运行结果:

tr1=25.5,str2= 25.5a
i1=25, i2=25
f1=25.000000, f2=25.000000

我们将代码改一下,在字符串面前加上空格和正负号,再运行:

#include <stdlib.h>
#include <stdio.h>
 
int main(void)
{
    int i1, i2;
    float f1, f2;
    char* str1 = "     25.5";
    char* str2 = "-25.5a";

    i1 = atoi(str1);
    i2 = atoi(str2);

    f1 = atoi(str1);
    f2 = atoi(str2);

    printf("str1=%s,str2= %s\n",str1, str2);
    printf("i1=%d, i2=%d\n", i1, i2);
    printf("f1=%f, f2=%f\n", f1, f2);

    return 0;
}

运行结果:

str1=     25.5,str2= -25.5a
i1=25, i2=-25
f1=25.000000, f2=-25.000000
举报

相关推荐

0 条评论