C语言数组与字符串操作实践
一维数组内存布局
点击查看代码
#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;
}