有两个磁盘文件A和B,各存放一行字母,要求把这两个文件中的信息合并(按字母顺序排列),输出到一个新文件C中。
#include <stdio.h> #include <stdlib.h> #include <string.h> int compare(const void *a, const void *b) { return (*(char *)a - *(char *)b); } int main() { FILE *fileA, *fileB, *fileC; char contentA[100], contentB[100], mergedContent[200]; // 打开文件A fileA = fopen("fileA.txt", "r"); if (fileA == NULL) { perror("Error opening fileA.txt"); return 1; } // 读取文件A的内容 fgets(contentA, sizeof(contentA), fileA); fclose(fileA); // 打开文件B fileB = fopen("fileB.txt", "r"); if (fileB == NULL) { perror("Error opening fileB.txt"); return 1; } // 读取文件B的内容 fgets(contentB, sizeof(contentB), fileB); fclose(fileB); // 合并两个文件的内容 strcpy(mergedContent, contentA); strcat(mergedContent, contentB); // 对合并后的内容进行排序 qsort(mergedContent, strlen(mergedContent), sizeof(char), compare); // 打开文件C fileC = fopen("fileC.txt", "w"); if (fileC == NULL) { perror("Error opening fileC.txt"); return 1; } // 将排序后的内容写入文件C fputs(mergedContent, fileC); fclose(fileC); printf("Merged and sorted content written to fileC.txt.\n"); return 0; }
计算字符串中子串出现的次数。
#include <stdio.h> int main() { char str1[20], str2[20], *p1, *p2; int sum = 0; // 输入两个字符串 printf("please input two strings\n"); scanf("%s%s", str1, str2); p1 = str1; p2 = str2; while (*p1 != '\0') { if (*p1 == *p2) { // 如果当前字符匹配,继续比较后续字符 while (*p1 == *p2 && *p2 != '\0') { p1++; p2++; } } else { // 如果当前字符不匹配,继续比较下一个位置 p1++; } // 如果p2指向了str2的末尾,说明str2在当前位置匹配 // 增加匹配次数,并重新初始化p2为str2的起始位置 if (*p2 == '\0') { sum++; } p2 = str2; } // 输出匹配次数 printf("%d", sum); return 0; }
这个程序采用了双指针的方式,通过比较两个字符串的字符来统计子串在主串中的出现次数。程序首先输入两个字符串,然后使用两个指针
p1
和p2
进行比较。主要的逻辑是在主串中找到一个匹配的起始位置,然后逐个比较字符,直到子串结束,同时统计匹配的次数。循环结束后输出匹配次数。
某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下:每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。
#include <stdio.h> int main() { int a, i, aa[4], t; // 输入一个四位整数 printf("Enter a four-digit integer: "); scanf("%d", &a); // 将四位整数按位存储在数组中 aa[0] = a % 10; aa[1] = a % 100 / 10; aa[2] = a % 1000 / 100; aa[3] = a / 1000; // 对每个数字进行加5操作,并对10取余,实现加密 for (i = 0; i <= 3; i++) { aa[i] += 5; aa[i] %= 10; } // 通过循环交换数组的第一位和第四位,第二位和第三位 for (i = 0; i <= 3 / 2; i++) { t = aa[i]; aa[i] = aa[3 - i]; aa[3 - i] = t; } // 以逆序的方式输出加密后的结果 for (i = 3; i >= 0; i--) printf("%d", aa[i]); return 0; }
写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。
#include <stdio.h> // 计算字符串长度的函数 int stringLength(const char *str) { int length = 0; // 遍历字符串,直到遇到 null 终止符 while (*str != '\0') { length++; str++; } return length; } int main() { char inputString[100]; // 输入字符串 printf("Enter a string: "); scanf("%s", inputString); // 调用函数计算字符串长度 int length = stringLength(inputString); // 输出字符串长度 printf("Length of the string: %d\n", length); return 0; }
实现strcmp函数。
#include <stdio.h> // 实现strcmp函数 int my_strcmp(const char *str1, const char *str2) { while (*str1 != '\0' && *str2 != '\0') { if (*str1 < *str2) { return -1; } else if (*str1 > *str2) { return 1; } str1++; str2++; } // 如果两个字符串的前缀相同,但有一个字符串较短,则较短的字符串被认为是较小的 if (*str1 == '\0' && *str2 != '\0') { return -1; } else if (*str1 != '\0' && *str2 == '\0') { return 1; } // 两个字符串相等 return 0; } int main() { // 测试strcmp函数实现 const char *str1 = "Hello"; const char *str2 = "World"; int result = my_strcmp(str1, str2); if (result < 0) { printf("%s comes before %s\n", str1, str2); } else if (result > 0) { printf("%s comes after %s\n", str1, str2); } else { printf("%s is equal to %s\n", str1, str2); } return 0; }
strcmp
函数是C标准库中的一个字符串比较函数,用于比较两个字符串的大小。上述代码中,
my_strcmp
函数接受两个字符串指针作为参数,然后比较它们的字符。如果第一个字符串小于第二个字符串,函数返回负值;如果第一个字符串大于第二个字符串,函数返回正值;如果两个字符串相等,函数返回零。在main
函数中,我们使用这个函数比较了两个字符串并输出结果。
取一个整数a从右端开始的4~7位。
#include <stdio.h> int main() { unsigned int a; // 从用户输入中读取一个整数 printf("Enter an integer: "); scanf("%u", &a); // 取从右端开始的第4到第7位 unsigned int mask = 0b1111; // 二进制表示的低4位全为1的掩码 unsigned int result = (a >> 3) & mask; // 右移3位,然后按位与操作 // 输出结果 printf("Bits 4 to 7 from the right: %u\n", result); return 0; }
在这个程序中:
- 从用户输入中读取一个无符号整数,存储在变量
a
中。- 创建一个低4位全为1的二进制掩码
0b1111
。- 将整数
a
右移3位,然后使用掩码进行按位与操作,得到从右端开始的第4到第7位的结果。- 输出结果。
请注意,程序中使用了二进制表示法
0b
来表示二进制数。如果输入的整数有更多位,你可以根据需要调整右移的位数和掩码。