sizeof()求字符数组的注意事项

问题描述

C程序中,用sizeof()计算char arr[]数组的(实际)长度时,得到的结果不是实际的长度,纠结了半天终于找到原因。

测试代码
#include <stdio.h>
#include <string.h>

int main()
{
    // 定义一个字符数组
    char arr1[] = "abcdefg";
    char arr2[10]="abcdefg";

    // 分别用sizeof()和strlen()求数组的长度
    printf("arr1的长度-- sizeof(arr1):%d, strlen(arr1): %d\n",sizeof(arr1), strlen(arr1));
    printf("arr2的长度-- sizeof(arr2):%d, strlen(arr2): %d\n",sizeof(arr2), strlen(arr2));
	
	return 0;
}

程序运行结果
运行结果

现象分析

sizeof()和strlen()的作用:

  • sizeof() 是一个单目运算符,用来获得字符数组在内存中所占的字节数,包含结束符。
  • strlen() 是一个函数,它用来计算指定字符串 的长度,但不包括结束字符。

简单讲:
sizeof返回的是编译器为数组分配的空间大小,不关心里面存了多少数据。
strlen只关心存储的数据内容,不关心空间的大小和类型。


以程序中的示例进行说明:

  • arr1[]数组,使用sizeof()时,返回编译器为其其配的空间大小为8,其中包含’\0’ 结束符,
  • arr2[]数组,使用sizeof()时,返回编译器为其分配的空间大小为10
  • strlen()返回的是数组中实际的元素数目。
  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个基本的员工绩效管理系统的代码示例: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_EMPLOYEES 1000 // 员工绩效结构体 struct EmployeePerformance { int id; char name[50]; char department[50]; float score; }; // 全局变量 struct EmployeePerformance employees[MAX_EMPLOYEES]; int numEmployees = 0; // 添加员工绩效记录 void addEmployee() { if (numEmployees >= MAX_EMPLOYEES) { printf("无法添加更多员工绩效记录!\n"); return; } struct EmployeePerformance emp; printf("请输入员工编号:"); scanf("%d", &emp.id); printf("请输入员工姓名:"); scanf("%s", emp.name); printf("请输入员工部门:"); scanf("%s", emp.department); printf("请输入员工绩效分数:"); scanf("%f", &emp.score); employees[numEmployees++] = emp; printf("成功添加员工绩效记录!\n"); } // 显示所有员工绩效记录 void displayEmployees() { printf("编号\t姓名\t部门\t绩效分数\n"); for (int i = 0; i < numEmployees; i++) { struct EmployeePerformance emp = employees[i]; printf("%d\t%s\t%s\t%.2f\n", emp.id, emp.name, emp.department, emp.score); } } // 保存记录到文件 void saveToFile() { FILE *fp = fopen("employees.txt", "w"); if (fp == NULL) { printf("无法打开文件!\n"); return; } for (int i = 0; i < numEmployees; i++) { struct EmployeePerformance emp = employees[i]; fprintf(fp, "%d,%s,%s,%.2f\n", emp.id, emp.name, emp.department, emp.score); } fclose(fp); printf("员工绩效记录已保存到文件!\n"); } // 从文件读取员工绩效记录 void loadFromFile() { FILE *fp = fopen("employees.txt", "r"); if (fp == NULL) { printf("无法打开文件!\n"); return; } numEmployees = 0; struct EmployeePerformance emp; while (fscanf(fp, "%d,%[^,],%[^,],%f\n", &emp.id, emp.name, emp.department, &emp.score) != EOF) { employees[numEmployees++] = emp; } fclose(fp); printf("成功从文件中读取员工绩效记录!\n"); } // 查询员工绩效记录 void searchEmployee() { int id; printf("请输入要查询的员工编号:"); scanf("%d", &id); for (int i = 0; i < numEmployees; i++) { struct EmployeePerformance emp = employees[i]; if (emp.id == id) { printf("编号\t姓名\t部门\t绩效分数\n"); printf("%d\t%s\t%s\t%.2f\n", emp.id, emp.name, emp.department, emp.score); return; } } printf("未找到该员工的绩效记录!\n"); } // 删除员工绩效记录 void deleteEmployee() { int id; printf("请输入要删除的员工编号:"); scanf("%d", &id); for (int i = 0; i < numEmployees; i++) { struct EmployeePerformance emp = employees[i]; if (emp.id == id) { for (int j = i; j < numEmployees - 1; j++) { employees[j] = employees[j + 1]; } numEmployees--; printf("成功删除员工绩效记录!\n"); return; } } printf("未找到该员工的绩效记录!\n"); } // 修改员工绩效记录 void modifyEmployee() { int id; printf("请输入要修改的员工编号:"); scanf("%d", &id); for (int i = 0; i < numEmployees; i++) { struct EmployeePerformance emp = employees[i]; if (emp.id == id) { printf("请输入修改后的员工姓名(按回车键保持不变):"); char name[50]; getchar(); fgets(name, 50, stdin); if (name[0] != '\n') { strcpy(emp.name, name); } printf("请输入修改后的员工部门(按回车键保持不变):"); char department[50]; fgets(department, 50, stdin); if (department[0] != '\n') { strcpy(emp.department, department); } printf("请输入修改后的员工绩效分数(按回车键保持不变):"); char scoreStr[10]; fgets(scoreStr, 10, stdin); if (scoreStr[0] != '\n') { emp.score = atof(scoreStr); } employees[i] = emp; printf("成功修改员工绩效记录!\n"); return; } } printf("未找到该员工的绩效记录!\n"); } // 绩效排名 void sortEmployees() { struct EmployeePerformance sortedEmployees[MAX_EMPLOYEES]; memcpy(sortedEmployees, employees, sizeof(struct EmployeePerformance) * numEmployees); for (int i = 0; i < numEmployees; i++) { for (int j = i + 1; j < numEmployees; j++) { if (sortedEmployees[i].score < sortedEmployees[j].score) { struct EmployeePerformance temp = sortedEmployees[i]; sortedEmployees[i] = sortedEmployees[j]; sortedEmployees[j] = temp; } } } printf("绩效排名\t编号\t姓名\t部门\t绩效分数\n"); for (int i = 0; i < numEmployees; i++) { struct EmployeePerformance emp = sortedEmployees[i]; printf("%d\t\t%d\t%s\t%s\t%.2f\n", i + 1, emp.id, emp.name, emp.department, emp.score); } } // 清空所有记录 void clearEmployees() { numEmployees = 0; printf("成功清空所有员工绩效记录!\n"); } int main() { while (1) { printf("请选择功能:\n"); printf("1. 创建员工绩效记录\n"); printf("2. 显示所有员工绩效记录\n"); printf("3. 清空所有记录\n"); printf("4. 保存记录到文件\n"); printf("5. 从文件读取员工绩效记录\n"); printf("6. 查询员工绩效记录\n"); printf("7. 删除员工绩效记录\n"); printf("8. 添加一个员工绩效记录\n"); printf("9. 修改员工绩效记录\n"); printf("10. 绩效排名\n"); printf("0. 退出程序\n"); int choice; scanf("%d", &choice); switch (choice) { case 1: addEmployee(); break; case 2: displayEmployees(); break; case 3: clearEmployees(); break; case 4: saveToFile(); break; case 5: loadFromFile(); break; case 6: searchEmployee(); break; case 7: deleteEmployee(); break; case 8: addEmployee(); break; case 9: modifyEmployee(); break; case 10: sortEmployees(); break; case 0: return 0; default: printf("无效的选择!\n"); break; } } } ``` 注意事项: - 本代码示例是使用 Dev-C++ 编写的,可以直接在 Dev-C++ 中运行。 - 本代码示例使用了文件操作,需要在程序所在目录下创建一个名为 `employees.txt` 的文本文件,用于存储员工绩效记录。如果该文件不存在,程序会自动创建该文件。 - 本代码示例中,查询、删除、修改员工绩效记录均需要输入员工编号。如果输入的编号不存在,则会提示未找到该员工的绩效记录。 - 本代码示例中,修改员工绩效记录可以只修改其中的某些属性,不需要全部重新输入。 - 本代码示例中,绩效排名是按照绩效分数从高到低排序的。如需按照其他属性排序,则需要在排序算法中进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UItogether

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值