第一题
#include <stdio.h>
int main() {
int numbers[100];
int n, i;
int odd_sum = 0, even_sum = 0;
// 获取输入的正整数个数
printf("请输入正整数的个数:");
scanf("%d", &n);
// 获取正整数序列
printf("请输入%d个正整数,以空格分隔:", n);
for (i = 0; i < n; i++) {
scanf("%d", &numbers[i]);
}
// 计算奇数位序上的奇数之和和偶数位序上的偶数之和
for (i = 0; i < n; i++) {
if ((i % 2 == 0) && (numbers[i] % 2 != 0)) {
odd_sum += numbers[i];
} else if ((i % 2 != 0) && (numbers[i] % 2 == 0)) {
even_sum += numbers[i];
}
}
// 输出结果
printf("奇数位序上的奇数之和:%d\n", odd_sum);
printf("偶数位序上的偶数之和:%d\n", even_sum);
return 0;
}
第二题:
#include <stdio.h>
#include <ctype.h>
#define MAX_SIZE 100
int main() {
char letters[MAX_SIZE];
int numbers[MAX_SIZE];
int symbols[MAX_SIZE];
int letter_count = 0, number_count = 0, symbol_count = 0;
char input[MAX_SIZE];
int i;
printf("请输入字符序列(以回车分隔),最多可输入%d个字符,输入EOF结束:\n", MAX_SIZE);
while (fgets(input, sizeof(input), stdin) != NULL) {
for (i = 0; input[i] != '\n'; i++) {
if (isalpha(input[i])) {
letters[letter_count] = tolower(input[i]);
letter_count++;
} else if (isdigit(input[i])) {
int number = 0;
int j;
for (j = i; isdigit(input[j]); j++) {
number = number * 10 + (input[j] - '0');
}
numbers[number_count] = number;
number_count++;
i = j - 1;
} else {
symbols[symbol_count] = input[i];
symbol_count++;
}
}
}
printf("字母数组内容:");
for (i = 0; i < letter_count; i++) {
printf("%c ", letters[i]);
}
printf("\n");
printf("数字数组内容:");
for (i = 0; i < number_count; i++) {
printf("%d ", numbers[i]);
}
printf("\n");
printf("符号数组内容:");
for (i = 0; i < symbol_count; i++) {
printf("%d ", symbols[i]);
}
printf("\n");
return 0;
}
在程序中,您可以连续输入字符序列,以回车分隔每个字符。程序会根据输入的字符将英文字母转换为小写字母并存入字符数组,将阿拉伯数字存入整数数组,将其他符号的ASCII码存入另一个数组。最后,程序将输出三个数组的内容。请注意,输入EOF来结束输入序列。
第三题;
#include <stdio.h>
#include <string.h>
#define MAX_SIZE 1000
void findOccurrences(const char *str, const char *article) {
int articleLen = strlen(article);
int strLen = strlen(str);
int occurrences[MAX_SIZE];
int count = 0;
// 在文章中查找字符串的出现位置
for (int i = 0; i <= articleLen - strLen; i++) {
int j;
for (j = 0; j < strLen; j++) {
if (article[i + j] != str[j]) {
break;
}
}
if (j == strLen) {
occurrences[count++] = i;
}
}
// 输出出现位置
if (count > 0) {
printf("字符串 '%s' 在文章中出现的位置:\n", str);
for (int i = 0; i < count; i++) {
printf("%d ", occurrences[i]);
}
printf("\n");
} else {
printf("字符串 '%s' 在文章中未找到。\n", str);
}
}
int main() {
// 英文文章
const char *article = "This is an example article. It demonstrates how to find occurrences of a given string in a text.";
// 给定的字符串
const char *str = "example";
// 在文章中查找字符串的出现位置
findOccurrences(str, article);
return 0;
}
scanf()会导致缓冲区溢出
如果忘了限制scanf()
读取字符串的长度,用户就可以输入远远超出程序空间的数据,多余的数据会写到计算机还没有分配好的存储器中。如果运气好,数据不但能保存,而且不会有任何问题。
但缓冲区溢出很有可能会导致程序出错,这种情况通常被称为段错误或abort trap,不管出现什么错误消息,程序都会崩溃。