当前位置:首页 > 技术 > 正文内容

C语言数组与字符串综合实践

访客 技术 2026年8月17日 1

实验一:一维数组内存布局分析

#include <stdio.h>
#include <stdlib.h>
#define SIZE 4
 
 void analyze_int_array() {
     int numbers[SIZE] = {5, 8, 3, 7};          
     int index;
 
     printf("整型数组占用内存: %zu字节\n", sizeof(numbers));
     
     for (index = 0; index < SIZE; ++index)
         printf("地址%p: 数值%d\n", &numbers[index], numbers[index]);
 
     printf("数组首地址: %p\n", numbers); 
 }
 
 void analyze_char_array() {        
     char chars[SIZE] = {'A', 'B', 'C', 'D'}; 
     int index;

     printf("字符数组占用内存: %zu字节\n", sizeof(chars));
 
     for (index = 0; index < SIZE; ++index)
         printf("地址%p: 字符%c\n", &chars[index], chars[index]);
     
     printf("数组首地址: %p\n", chars); 
 }
 
 int main() {
     printf("分析一: 整型数组内存分布\n");
     analyze_int_array();
 
     printf("\n分析二: 字符数组内存分布\n");
     analyze_char_array();
 
     system("pause");
     return 0;
}

实验观察:整型数组元素在内存中连续分配,每个元素占用4字节;字符数组同样连续分配,每个元素占用1字节。

实验二:二维数组存储特性研究

#include <stdio.h>
#include <stdlib.h>
#define ROWS 2
#define COLS 4

void analyze_int_matrix() {
   int matrix[ROWS][COLS] = {{10, 20, 30, 40}, {50, 60, 70, 80}};
    int row, col;

    printf("整型矩阵占用内存: %zu字节\n", sizeof(matrix));

    for (row = 0; row < ROWS; ++row)
        for (col = 0; col < COLS; ++col)
            printf("地址%p: 数值%d\n", &matrix[row][col], matrix[row][col]);
    printf("\n");

    printf("矩阵地址%p\n", matrix);
    printf("第一行地址%p\n", matrix[0]);
    printf("第二行地址%p\n", matrix[1]);
    printf("\n");
}

void analyze_char_matrix() {
    char grid[ROWS][COLS] = {{'W', 'X', 'Y', 'Z'}, {'P', 'Q', 'R', 'S'}};
    int row, col;

    printf("字符矩阵占用内存: %zu字节\n", sizeof(grid));

    for (row = 0; row < ROWS; ++row)
        for (col = 0; col < COLS; ++col)
            printf("地址%p: 字符%c\n", &grid[row][col], grid[row][col]);
    printf("\n");

    printf("矩阵地址%p\n", grid);
    printf("第一行地址%p\n", grid[0]);
    printf("第二行地址%p\n", grid[1]);
}

int main() {
    printf("测试一: 整型二维数组");
    analyze_int_matrix();

    printf("\n测试二: 字符二维数组");
    analyze_char_matrix();

    system("pause");
    return 0;
}

实验结论:二维数组按行优先顺序连续存储,相邻行地址差值等于一行元素占用的总字节数。

实验三:字符串交换实现

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXLEN 80

void exchange_strings(char dest[], char src[]);
void test_single_arrays();
void test_double_array();

int main() {
    printf("测试一: 使用两个独立一维数组\n");
    test_single_arrays();

    printf("\n测试二: 使用二维数组行\n");
    test_double_array();

    system("pause");
    return 0;
}

void test_single_arrays() {
    char text1[MAXLEN] = "hello world, nice to meet you";
    char text2[MAXLEN] = "goodbye world, see you later";

    printf("交换前: \n");
    puts(text1);
    puts(text2);

    exchange_strings(text1, text2);

    printf("交换后: \n");
    puts(text1);
    puts(text2);
}

void test_double_array() {
    char texts[2][MAXLEN] = {"hello world, nice to meet you", 
                             "goodbye world, see you later"};

    printf("交换前: \n");
    puts(texts[0]);
    puts(texts[1]);

    exchange_strings(texts[0], texts[1]);

    printf("交换后: \n");
    puts(texts[0]);
    puts(texts[1]);
}

void exchange_strings(char dest[MAXLEN], char src[MAXLEN]) {
    char buffer[MAXLEN];

    strcpy(buffer, dest);
    strcpy(dest, src);
    strcpy(src, buffer);
}

思考总结:一维数组名代表数组起始地址;二维数组名指向第一行,每行可视为独立的一维数组。

实验四:英文文本单词统计

#include <stdio.h>
#include <stdlib.h>

#define BUFFER 80

int word_counter(char text[]);

int main() {
    char sentence[BUFFER+1];
    int count;

    while(gets(sentence) != NULL) {
        count = word_counter(sentence);
        printf("检测到的单词数量: %d\n\n", count);
    }

    system("pause");
    return 0;
}

int word_counter(char text[]) {
    int pos;
    int in_word = 0;
    int total = 0;

    for(pos = 0; text[pos] != '\0'; pos++) {
        if(text[pos] == ' ')
            in_word = 0;
        else if(in_word == 0) {
            in_word = 1;
            total++;
        }
    }

    return total;
}

实验五:最长单词查找算法

#include <stdio.h>
#include <stdlib.h>
#define MAX_TEXT 1000

int main() {
    char content[MAX_TEXT];
    int current_len;
    int longest_len;
    int end_pos;
    int idx;

    while(gets(content) != NULL) {
        current_len = 0;
        longest_len = 0;
        end_pos = 0;

        idx = 0;
        while(1) {
            while(content[idx] == ' ') {
                current_len = 0;
                idx++;
            }

            while(content[idx] != '\0' && content[idx] != ' ') {
                current_len++;
                idx++;
            }
        
            if(longest_len < current_len) {
                longest_len = current_len;
                end_pos = idx;
            }

            if(content[idx] == '\0')
                break;
        }

        printf("最长单词: ");
        for(idx = end_pos - longest_len; idx < end_pos; ++idx)
            printf("%c", content[idx]);
        printf("\n\n");
    }

    system("pause");
    return 0;
}

实验六:进制转换工具

#include <stdio.h>
#include <stdlib.h>
#define MAX_DIGITS 100
void convert_base(int value, int base);

int main() {
    int decimal;

    printf("请输入十进制整数: ");
    while(scanf("%d", &decimal) != EOF) {
        convert_base(decimal, 2);
        convert_base(decimal, 8);
        convert_base(decimal, 16);

        printf("\n请输入十进制整数: ");
    }

    system("pause");
    return 0;
}

void convert_base(int value, int base){
    char result[MAX_DIGITS];
    char digits[17]="0123456789ABCDEF";
    
    int quotient, remainder;
    int position, index;
    
    position = 0;
    while(1) {
        quotient = value / base;
        remainder = value % base;
        result[position++] = digits[remainder];
        
        if(quotient == 0)
            break;
        
        value = quotient;
    }
    
    for(index = position - 1; index >= 0; --index)
        printf("%c", result[index]);
    printf("\n");
}

实验七:成绩管理系统

#include <stdio.h>
#include <stdlib.h>
#define STUDENTS 5

void collect_data(int scores[], int count);
void display_data(int scores[], int count);
double calculate_average(int scores[], int count);
void sort_descending(int scores[], int count);

int main() {
    int grades[STUDENTS];
    double avg;
    
    printf("请录入%d个学生成绩:\n", STUDENTS);
    collect_data(grades, STUDENTS);
    
    printf("\n原始成绩数据: \n");
    display_data(grades, STUDENTS);
    
    printf("\n正在处理数据: 计算平均分并排序...\n");
    avg = calculate_average(grades, STUDENTS);
    sort_descending(grades, STUDENTS);
    
    printf("\n平均成绩: %.2f\n", avg);
    printf("\n排序后成绩(从高到低):\n");
    display_data(grades, STUDENTS);
    
    system("pause");
    return 0;
}

void collect_data(int scores[], int count) {
    int i;
    
    for(i = 0; i < count; ++i)
        scanf("%d", &scores[i]); 
}

void display_data(int scores[], int count) {
    int i;
    
    for(i = 0; i < count; ++i)
        printf("%d ", scores[i]);
    printf("\n");
}

double calculate_average(int scores[], int count){
    int i;
    int total = 0;
    double mean;
    for(i = 0; i < count; ++i){
        total = total + scores[i];
    }
    mean = (double)total / count;
    return mean;
}

void sort_descending(int scores[], int count){
    int i, j, temp;
    for(j = 0; j < count - 1; j++)
        for(i = 0; i < count - j - 1; i++)
            if(scores[i] < scores[i + 1])
            {
                temp = scores[i];
                scores[i] = scores[i + 1];
                scores[i + 1] = temp;
            }
}

实验八:姓名字典排序

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

#define COUNT 5
#define LENGTH 20

void show_names(char list[][LENGTH], int num);
void sort_lexicographically(char list[][LENGTH], int num);

int main() {
    char people[][LENGTH] = {"Alice", "Bob", "Charlie", "David", "Eve"};
    int i;

    printf("初始名单:\n");
    show_names(people, COUNT);

    printf("\n执行字典排序...\n");
    sort_lexicographically(people, COUNT);

    printf("\n排序后名单:\n");
    show_names(people, COUNT);
    system("pause");
    return 0;
}

void show_names(char list[][LENGTH], int num) {
    int i;

    for(i = 0; i < num; ++i)
        printf("%s\n", list[i]);
}

void sort_lexicographically(char list[][LENGTH], int num){
    int i, j;
    char swap[LENGTH];
    for(j = 0; j < num - 1; j++){
        for(i = 0; i < num - j - 1; i++){
            if(strcmp(list[i], list[i + 1]) > 0){
                strcpy(swap, list[i]);
                strcpy(list[i], list[i + 1]);
                strcpy(list[i + 1], swap);
            }
        }
    }
}

实验九:数字重复检测

#include <stdio.h>
#include <stdlib.h>
#define MAX_INPUT 105

int has_duplicate(char input[]);

int main(){
    char number[MAX_INPUT];

    while(scanf("%s", number) != EOF){
        if(has_duplicate(number))
            printf("存在重复\n");
        else
            printf("无重复\n");
    }
    system("pause");
    return 0;
}

int has_duplicate(char input[]){
    int digit_count[10] = {0};
    int i, digit;

    for(i = 0; input[i] != '\0'; ++i){
        digit = input[i] - '0';
        digit_count[digit]++;

        if(digit_count[digit] > 1)
            return 1;
    }
    return 0;
}

实验十:矩阵循环移位

#include <stdio.h>
#include <stdlib.h>
#define ROWS 4
#define COLS 4

void display_matrix(int data[][COLS], int size);          
void shift_right(int data[][COLS], int size); 

int main() {
    int matrix[ROWS][COLS] = {{11, 22, 33, 44},
                              {55, 66, 77, 88},
                              {99, 10, 20, 30},
                              {40, 50, 60, 70}};

    printf("原始矩阵:\n");
    display_matrix(matrix, ROWS); 

    shift_right(matrix, ROWS); 

    printf("右移一位后:\n");
    display_matrix(matrix, ROWS);

    system("pause");
    return 0;
}

void display_matrix(int data[][COLS], int size) {
    int i, j;

    for (i = 0; i < size; ++i) {
        for (j = 0; j < size; ++j)
            printf("%4d", data[i][j]);
        printf("\n");
    }
}

void shift_right(int data[][COLS], int size){
    int i, j;
    int last_element;
    
    for(i = 0; i < size; i++){
        last_element = data[i][size - 1];
        for(j = size - 1; j > 0; j--){
            data[i][j] = data[i][j - 1];
        }
        data[i][0] = last_element;
    }
}

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。