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

C语言数组与字符串操作实践

访客 技术 2026年6月22日 1

一维数组内存布局

点击查看代码
#include <stdio.h>
#define SIZE 4

void demo_int_array() {
    int arr[SIZE] = {1, 9, 8, 4};
    printf("数组大小: %d字节\n", sizeof(arr));
    for(int i=0; i<SIZE; i++)
        printf("地址:%p 值:%d\n", &arr[i], arr[i]);
    printf("数组首地址: %p\n", arr); 
}

void demo_char_array() {
    char chars[SIZE] = {'1','9','8','4'};
    printf("数组大小: %d字节\n", sizeof(chars));
    for(int i=0; i<SIZE; i++)
        printf("地址:%p 值:%c\n", &chars[i], chars[i]);
    printf("数组首地址: %p\n", chars);
}

int main() {
    printf("整型数组测试:\n");
    demo_int_array();
    printf("\n字符数组测试:\n");
    demo_char_array();
    return 0;
}

整型数组元素连续存储,每元素占4字节。字符数组元素连续存储,每元素占1字节。数组名值为首元素地址。

二维数组内存布局

点击查看代码
#include <stdio.h>
#define ROWS 2
#define COLS 4

void int_matrix_demo() {
    int matrix[ROWS][COLS] = {{1,9,8,4},{2,0,4,9}};
    printf("矩阵大小: %d字节\n", sizeof(matrix));
    for(int i=0; i<ROWS; i++) {
        for(int j=0; j<COLS; j++)
            printf("地址:%p 值:%d\n", &matrix[i][j], matrix[i][j]);
    }
    printf("矩阵地址: %p\n", matrix);
    printf("首行地址: %p\n", matrix[0]);
}

void char_matrix_demo() {
    char chars[ROWS][COLS] = {{'1','9','8','4'},{'2','0','4','9'}};
    printf("矩阵大小: %d字节\n", sizeof(chars));
    for(int i=0; i<ROWS; i++) {
        for(int j=0; j<COLS; j++)
            printf("地址:%p 值:%c\n", &chars[i][j], chars[i][j]);
    }
    printf("矩阵地址: %p\n", chars);
    printf("首行地址: %p\n", chars[0]);
}

int main() {
    printf("整型二维数组:\n");
    int_matrix_demo();
    printf("\n字符二维数组:\n");
    char_matrix_demo();
    return 0;
}

二维数组按行连续存储,整型元素占4字节,字符元素占1字节。数组名、首行地址与首元素地址值相同。

字符串交换实现

点击查看代码
#include <stdio.h>
#include <string.h>
#define MAX_LEN 80

void swap_strings(char s1[], char s2[]) {
    char buffer[MAX_LEN];
    strcpy(buffer, s1);
    strcpy(s1, s2);
    strcpy(s2, buffer);
}

void test_1d_arrays() {
    char str1[MAX_LEN] = "Hello, C";
    char str2[MAX_LEN] = "Goodbye, C";
    swap_strings(str1, str2);
    printf("交换后:\n%s\n%s\n", str1, str2);
}

void test_2d_arrays() {
    char strings[2][MAX_LEN] = {"Hello, C", "Goodbye, C"};
    swap_strings(strings[0], strings[1]);
    printf("交换后:\n%s\n%s\n", strings[0], strings[1]);
}

int main() {
    printf("一维数组交换测试:\n");
    test_1d_arrays();
    printf("\n二维数组交换测试:\n");
    test_2d_arrays();
    return 0;
}

一维数组可直接使用数组名操作,二维数组需指定行索引访问。

文本处理功能

点击查看代码
#include <stdio.h>
#define MAX_LEN 1000

int count_words(char text[]) {
    int count = 0, in_word = 0;
    for(int i=0; text[i]; i++) {
        if(text[i]==' ') in_word=0;
        else if(!in_word) {
            in_word=1;
            count++;
        }
    }
    return count;
}

void find_longest_word(char line[]) {
    int max_len=0, end_pos=0, curr_len=0;
    for(int i=0; line[i]; i++) {
        if(line[i]==' ') {
            if(curr_len>max_len) {
                max_len=curr_len;
                end_pos=i;
            }
            curr_len=0;
        }
        else curr_len++;
    }
    printf("最长单词: ");
    for(int i=end_pos-max_len; i<end_pos; i++)
        printf("%c", line[i]);
    printf("\n");
}

int main() {
    char input[MAX_LEN];
    while(fgets(input, MAX_LEN, stdin)) {
        printf("单词数量: %d\n", count_words(input));
        find_longest_word(input);
    }
    return 0;
}

进制转换器

点击查看代码
#include <stdio.h>
#define MAX_DIGITS 100

void convert_base(int num, int base) {
    char digits[] = "0123456789ABCDEF";
    char result[MAX_DIGITS];
    int index = 0;
    
    while(num) {
        result[index++] = digits[num%base];
        num /= base;
    }
    for(int i=index-1; i>=0; i--)
        printf("%c", result[i]);
    printf("\n");
}

int main() {
    int number;
    while(scanf("%d", &number)!=EOF) {
        printf("二进制: "); convert_base(number, 2);
        printf("八进制: "); convert_base(number, 8);
        printf("十六进制: "); convert_base(number, 16);
    }
    return 0;
}

成绩统计分析

点击查看代码
#include <stdio.h>
#define NUM_SCORES 5

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

void sort_scores(int arr[], int n) {
    for(int i=0; i<n-1; i++)
        for(int j=0; j<n-1-i; j++)
            if(arr[j]<arr[j+1]) {
                int temp=arr[j];
                arr[j]=arr[j+1];
                arr[j+1]=temp;
            }
}

double calc_average(int arr[], int n) {
    double total=0;
    for(int i=0; i<n; i++)
        total += arr[i];
    return total/n;
}

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

int main() {
    int scores[NUM_SCORES];
    input_scores(scores, NUM_SCORES);
    sort_scores(scores, NUM_SCORES);
    printf("平均分: %.2f\n", calc_average(scores, NUM_SCORES));
    printf("排序结果: ");
    output_scores(scores, NUM_SCORES);
    return 0;
}

字符串字典排序

点击查看代码
#include <stdio.h>
#include <string.h>
#define NUM_NAMES 5
#define NAME_LEN 20

void sort_names(char names[][NAME_LEN], int n) {
    char temp[NAME_LEN];
    for(int i=0; i<n-1; i++)
        for(int j=0; j<n-1-i; j++)
            if(strcmp(names[j], names[j+1])>0) {
                strcpy(temp, names[j]);
                strcpy(names[j], names[j+1]);
                strcpy(names[j+1], temp);
            }
}

void print_names(char names[][NAME_LEN], int n) {
    for(int i=0; i<n; i++)
        printf("%s\n", names[i]);
}

int main() {
    char names[NUM_NAMES][NAME_LEN] = {"Bob","Bill","Joseph","Taylor","George"};
    sort_names(names, NUM_NAMES);
    print_names(names, NUM_NAMES);
    return 0;
}

数字重复检测

点击查看代码
#include <stdio.h>
#include <string.h>
#define MAX_DIGITS 100

int has_repeating_digits(char num_str[]) {
    int count[10]={0};
    for(int i=0; num_str[i]; i++) {
        int digit=num_str[i]-'0';
        if(++count[digit]>1) return 1;
    }
    return 0;
}

int main() {
    char number[MAX_DIGITS];
    while(scanf("%s", number)!=EOF) {
        if(has_repeating_digits(number)) printf("存在重复\n");
        else printf("无重复\n");
    }
    return 0;
}

矩阵列循环移位

点击查看代码
#include <stdio.h>
#define DIM 4
#define MAX_SIZE 100

void shift_matrix(int mat[][MAX_SIZE], int n) {
    for(int i=0; i<n; i++) {
        int last = mat[i][n-1];
        for(int j=n-1; j>0; j--)
            mat[i][j] = mat[i][j-1];
        mat[i][0] = last;
    }
}

void print_matrix(int mat[][MAX_SIZE], int n) {
    for(int i=0; i<n; i++) {
        for(int j=0; j<n; j++)
            printf("%4d", mat[i][j]);
        printf("\n");
    }
}

int main() {
    int matrix[DIM][MAX_SIZE] = {
        {21,12,13,24},
        {25,16,47,38},
        {29,11,32,54},
        {42,21,33,10}
    };
    shift_matrix(matrix, DIM);
    print_matrix(matrix, DIM);
    return 0;
}

相关文章

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...

发表评论

访客

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