【C语言入门】 编写简单程序

44 阅读9分钟

本篇介绍编写简单程序的基础内容,包括基本的输入输出操作(掌握scanf和printf等函数)、简单的数学计算程序(实现加减乘除等基本运算)以及字符串处理程序(进行字符串拼接、查找、替换等操作)。适合初学者入门学习。

一、基本的输入输出操作:掌握 scanf 和 printf

在编写程序时,与用户进行交互是必不可少的。掌握scanf和printf等标准输入输出函数的使用,是实现这一交互的关键。

1.1. 需求描述

在C语言中,printfscanf 是最常用的标准输入输出函数。printf 用于向标准输出(通常是屏幕)打印格式化的字符串,而 scanf 用于从标准输入(通常是键盘)读取格式化的输入。

  • printf 的基本用法是 printf(format, ...);,其中 format 是一个包含文本和格式说明符的字符串,... 是要打印的变量。

  • scanf 的基本用法是 scanf(format, ...);,其中 format 是一个包含格式说明符的字符串,... 是用于存储输入值的变量地址(通过 & 运算符获取)。

1.2. 代码示例

以下是一个简单的C程序,使用 printf 打印提示信息,然后使用 scanf 读取用户输入的两个整数,并打印它们的和。

#include <stdio.h>  
  
int main() {  
    int num1, num2, sum;  
  
    // 打印提示信息  
    printf("请输入第一个整数: ");  
    // 读取第一个整数  
    scanf("%d", &num1);  
  
    // 打印提示信息  
    printf("请输入第二个整数: ");  
    // 读取第二个整数  
    scanf("%d", &num2);  
  
    // 计算和  
    sum = num1 + num2;  
  
    // 打印结果  
    printf("两个整数的和是: %d\n", sum);  
  
    return 0;  
}

1.3. 测试用例和结果

测试用例1

  • 输入: 510

  • 预期输出: 两个整数的和是: 15

  • 实际运行结果:

测试用例2

  • 输入: -37

  • 预期输出: 两个整数的和是: 4

  • 实际运行结果:

测试用例3(包含空格的输入)

  • 输入: 89(注意输入前的空格)

  • 预期输出: 两个整数的和是: 17(空格被忽略,因为 %d 忽略前导空格)

  • 实际运行结果:

二、简单的数学计算程序

编写能够执行基本数学运算(如加减乘除)的程序,是编程入门的重要一步。通过接收用户输入的两个数字和一个运算符,程序可以计算出结果并输出。

2.1. 需求描述

需求:实现基本的数学运算,包括加法、减法、乘法和除法。程序将提示用户输入两个数字和一个运算符,然后根据输入的运算符执行相应的计算,并输出结果。

2.2. 代码示例

##include <stdio.h>   

int main() {  
    double num1, num2, result;  
    char operator;  
  
    // 提示用户输入第一个数字  
    printf("请输入第一个数字: ");  
    scanf("%lf", &num1);  
  
    // 提示用户输入运算符  
    printf("请输入运算符 (+, -, *, /): ");  
    scanf(" %c", &operator); // 注意前面的空格,用于忽略前一个输入后的换行符  
  
    // 提示用户输入第二个数字  
    printf("请输入第二个数字: ");  
    scanf("%lf", &num2);  
  
    // 根据运算符执行计算  
    switch (operator) {  
        case '+':  
            result = num1 + num2;  
            break;  
        case '-':  
            result = num1 - num2;  
            break;  
        case '*':  
            result = num1 * num2;  
            break;  
        case '/':  
            // 检查除数是否为零  
            if (num2 != 0) {  
                result = num1 / num2;  
            } else {  
                printf("错误: 除数不能为零。\n");  
                return 1; // 返回非零值表示错误  
            }  
            break;  
        default:  
            printf("错误: 无效的运算符。\n");  
            return 1; // 返回非零值表示错误  
    }  
  
    // 输出结果  
    printf("结果: %.2lf %c %.2lf = %.2lf\n", num1, operator, num2, result);  
  
    return 0; // 返回零表示成功  
}

2.3. 测试用例和结果

测试用例1

  • 输入: 5, +, 3

  • 输出: 结果: 5.00 + 3.00 = 8.00

  • 运行结果:

测试用例2

  • 输入: 10, -, 4

  • 输出: 结果: 10.00 - 4.00 = 6.00

  • 运行结果:

测试用例****3

  • 输入: 6, *, 7

  • 输出: 结果: 6.00 * 7.00 = 42.00

  • 运行结果:

测试用例4

  • 输入: 8, /, 2

  • 输出: 结果: 8.00 / 2.00 = 4.00

  • 运行结果:

测试用例5(无效运算符)

  • 输入: 5, %, 3

  • 输出: 错误: 无效的运算符。

  • 运行结果:

测试用例6(除数为零)

  • 输入: 10, /, 0

  • 输出: 错误: 除数不能为零。

  • 运行结果:

三、字符串处理程序

字符串是编程中常用的数据类型之一。编写能够处理字符串的程序,如拼接、查找和替换等操作,对于提高编程能力具有重要意义。在实现这些功能时,要特别注意字符串的边界条件和内存管理,以避免出现错误。

3.1. 需求描述

  • 实现基本的字符串操作,包括字符串拼接、查找子字符串和替换子字符串。为了简化,我们将使用标准C库中的字符串函数,如 strcat, strchr, 和自定义的替换函数(因为C标准库没有直接的字符串替换函数)。

3.2. 代码示例

#include <stdio.h>  
#include <string.h>  
#include <stdlib.h>  
  
// 自定义字符串替换函数  
char* str_replace(const char* str, const char* old_substr, const char* new_substr) {  
    char* result;  
    int i, count = 0;  
    int old_substr_len = strlen(old_substr);  
    int new_substr_len = strlen(new_substr);  
  
    // 计算新字符串的长度  
    for (i = 0; str[i] != '\0'; i++) {  
        if (strstr(&str[i], old_substr) == &str[i]) {  
            count++;  
            i += old_substr_len - 1;  
        }  
    }  
  
    // 分配内存给新字符串  
    result = (char*)malloc(i - count * old_substr_len + count * new_substr_len + 1);  
    if (!result) {  
        perror("内存分配失败");  
        exit(EXIT_FAILURE);  
    }  
  
    i = 0;  
    while (*str) {  
        // 如果找到子字符串,则替换它  
        if (strstr(str, old_substr) == str) {  
            strcpy(&result[i], new_substr);  
            i += new_substr_len;  
            str += old_substr_len;  
        } else {  
            result[i++] = *str++;  
        }  
    }  
    result[i] = '\0';  
  
    return result;  
}  
  
int main() {  
    char str1[100], str2[100], result[200];  
    char old_substr[50], new_substr[50];  
  
    // 字符串拼接示例  
    printf("请输入第一个字符串: ");  
    scanf("%s", str1);  
    printf("请输入第二个字符串: ");  
    scanf("%s", str2);  
    strcat(str1, str2);  
    printf("拼接后的字符串: %s\n", str1);  
  
    // 查找子字符串示例  
    printf("请输入要查找的子字符串: ");  
    scanf("%s", old_substr);  
    char* pos = strchr(str1, old_substr[0]); // 注意:这里只查找子字符串的第一个字符的位置,然后需要手动验证整个子字符串  
    if (pos && strncmp(pos, old_substr, strlen(old_substr)) == 0) {  
        printf("子字符串 '%s' 在位置 %ld 找到。\n", old_substr, pos - str1);  
    } else {  
        printf("子字符串 '%s' 未找到。\n", old_substr);  
    }  
  
    // 字符串替换示例  
    printf("请输入要替换成的子字符串: ");  
    scanf("%s", new_substr);  
    strcpy(result, str1); // 复制原始字符串到结果字符串,因为str_replace会分配新内存  
    char* replaced_str = str_replace(result, old_substr, new_substr);  
    printf("替换后的字符串: %s\n", replaced_str);  
  
    // 释放分配的内存(如果使用了动态内存分配)  
    free(replaced_str); // 注意:如果result和replaced_str指向同一块内存,则不需要再次释放result  
  
    return 0;  
}

注意:上面的 str_replace 函数实现有一个限制,它只处理不重叠的子字符串替换,并且假设输入的字符串和子字符串不包含空字符(\0)。此外,由于 strchr 只能找到子字符串的第一个字符的位置,因此上面的查找子字符串的示例并不完整;它应该使用 strstr 来找到整个子字符串的位置。但是,为了简化示例,这里只展示了基本的思路。

3.3. 测试用例

测试用例1(字符串拼接)

  • 输入: Hello, World

  • 输出: 拼接后的字符串: HelloWorld

测试用例2(查找子字符串)

  • 输入: HelloWorld, World

  • 输出: 子字符串 'World' 在位置 5 找到。

测试用例****3(字符串替换)

  • 输入: HelloWorld, World, C

  • 输出: 替换后的字符串: HelloC

3.4. 运行结果

根据测试用例输入相应的值,程序将输出相应的结果。

(注意:对于字符串替换的测试,需要根据实际的 str_replace 函数实现和输入来调整期望的输出,因为上面的实现有一些限制和简化。)

重要提示:在实际应用中,请务必对输入进行验证,以避免缓冲区溢出、内存泄漏等安全问题。上面的示例代码为了简化而省略了一些错误处理和安全检查。

四、注意事项

在编写简单程序时,除了掌握基本的输入输出操作、数学计算和字符串处理技巧外,还需要注意以下几个关键点:

4.1. 输入验证

  • 在接收用户输入时,务必进行必要的验证。包括检查输入的数据类型是否正确(如数字、字符串等),以及输入的值是否在预期的范围内。

  • 通过输入验证,可以确保程序不会因为无效输入而崩溃或产生错误结果。

4.2. 错误处理

  • 程序在运行过程中可能会遇到各种错误情况,如除数为零、文件无法打开等。

  • 为了提高程序的健壮性,需要编写相应的错误处理代码来应对这些异常情况。可以包括显示错误消息、退出程序或采取其他适当的恢复措施。

4.3.代码可读性

  • 编写清晰、易读的代码对于程序的维护和扩展至关重要。

  • 要注意代码的格式,如缩进、空格和换行等,以使其结构清晰、易于理解。

  • 同时,应遵循命名规范,为变量、函数和类等选择合适的名称,以便他人能够轻松理解代码的含义。

  • 此外,添加适当的注释可以帮助解释代码的功能和目的,进一步提高代码的可读性。