草庐IT

【技术积累】C语言基础实战知识【第一版】

SYF 2023-03-28 原文

基础语法

输出语句

#include <stdio.h>
int main(void)
{
	printf("-------分界线1------- \n");
	printf("Hello world");
	printf(" \n-------分界线2------- \n");
	printf("Hello world \n");
	printf(" \n-------分界线3------- \n");
	printf("Hello \n world \n");
	printf(" \n-------分界线4------- \n");
	printf("Hello \n");
	printf("world \n");
	printf(" \n-------分界线5------- \n");
	printf("Hello world \a\a\a\n");
	return 0;
} 
  1. printf:在显示器上进行输出操作,末尾的f代表format【格式化】
  2. \n是换行字符
  3. \a是响铃的转义字符,在显示您好之后响铃3次

变量

#include <stdio.h>
int main(void)
{
	printf("-------分界线1------- \n");
	int vx;
	printf("vx的值是%d",vx); 
	printf(" \n-------分界线2------- \n");
	int vy=100;
	printf("vy的值是%d",vy); 
	return 0;
} 

输入输出语句

#include <stdio.h>
int main(void)
{
	printf("-------分界线1------- \n");
	int no;
	printf("Please input a postive number:");
	scanf("%d",&no);
	printf("The number is %d \n",no); 
	printf(" \n-------分界线2------- \n");
	int n1,n2;
	puts("Please input two numbers:");
	printf("The first number is: ");  scanf("%d",&n1);
	printf("The second number is:");  scanf("%d",&n2);
	printf("The result of the addition:%d \n",n1+n2);
	printf(" \n-------分界线3------- \n");
	int n3,n4;
	int wa;
	puts("Please input two numbers:");
	printf("The first number is: ");  scanf("%d",&n3);
	printf("The second number is:");  scanf("%d",&n4);
	wa=n3+n4;
	printf("The result of the addition:%d \n",wa);
	return 0;

} 

  1. scanf函数可以从键盘读取输入的信息
  2. 这里同样可以用“%d"来限制函数只能读取十进制数
  3. 与printf函数不同,在使用scanf函数进行读取时,变量名前必须加上一个特殊的符号&。具体含义后续说明
  4. puts函数末尾的s来自string,可以按顺序输出字符串,并在结尾换行相当于printf("\n")
  5. 第三组中对程序进行了修改,先将结果保存在wa中再输出,这里不明显,但是在复杂的程序中可以有明显的优势

运算和数据类型

运算符

#include <stdio.h>
int main(void)
{
	int vx,vy;
	puts("Please input two numbers");
	printf("The number vx :"); scanf("%d",&vx);
	printf("The number vy :"); scanf("%d",&vy);
	
	printf("vx + vy = %d\n",vx+vy);
	printf("vx - vy = %d\n",vx-vy);
	printf("vx * vy = %d\n",vx*vy);
	printf("vx / vy = %d\n",vx/vy);
	printf("vx % vy = %d\n",vx%vy);
	printf("vx %% vy = %d\n",vx+vy);
	return 0;

} 

  1. 让我们来看一下程序中输出余数的地方( 蓝色底纹部分)。格式化字符串中写的是%%。这里的格式化字符串中的%号具有转换说明的功能。因此,当不需要进行转换说明,而只想输出%的时候,就必须写成%%。
  2. 当使用不具有转换说明功能的puts函数来进行输出的时候,就不能写成% (这样会输出%%的)。

数据类型

#include <stdio.h>
int main(void)
{
	printf("-------分界线1------- \n");
	int n;
	double x;
	n=9.99;
	x=9.99;
	printf("int   型变量n的值:%d\n",n);
	printf("		  n / 2:%d\n",n/2);
	
	printf("double型变量x的值:%f\n",x);
	printf("		  x /2.0:%d\n",x/2);
	
	printf(" \n-------分界线2------- \n");
	double vx,vy;
	printf("The number vx is:"); scanf("%lf",&vx);
	printf("The number vy is:"); scanf("%lf",&vy);
	
	printf("vx + vy =%f\n",vx+vy);
	printf("vx - vy =%f\n",vx-vy);
	printf("vx * vy =%f\n",vx*vy);
	printf("vx / vy =%f\n",vx/vy);
	
	printf(" \n-------分界线3------- \n");
	int n1,n2,n3,n4;
	double d1,d2,d3,d4;
	
	n1=5/2;
	n2=5.0/2.0;
	n3=5.0/2;
	n4=5/2.0;
	
	d1=5/2;
	d2=5.0/2.0;
	d3=5.0/2;
	d4=5/2.0;
	
	printf("n1 = %d\n",n1);
	printf("n2 = %d\n",n2);
	printf("n3 = %d\n",n3);
	printf("n4 = %d\n\n",n4);
	
	printf("d1 = %f\n",d1);
	printf("d2 = %f\n",d2);
	printf("d3 = %f\n",d3);
	printf("d4 = %f\n",d4);
	printf(" \n-------分界线4------- \n");
	int a,b;
	puts("Please input two numbers");
	printf("The number a is:");scanf("%d",&a);
	printf("The number b is:");scanf("%d",&b);
	printf("The average of a and b is %f:\n",(a+b)/2.0);
	printf(" \n-------分界线5------- \n");
	int a1,b1;
	puts("Please input two numbers");
	printf("The number a1 is:");scanf("%d",&a1);
	printf("The number b1 is:");scanf("%d",&b1);
	printf("The average of a1 and b1 is %f:\n",(a1+b1)/2.0);
	printf(" \n-------分界线6------- \n");
	int a2,b2,c2;
	int sum;
	double ave;
	
	puts("Please input three numbers");
	printf("The number a2 is:");scanf("%d",&a2); 
	printf("The number b2 is:");scanf("%d",&b2); 
	printf("The number c2 is:");scanf("%d",&c2); 
	sum=a2+b2+c2;
	ave=(double)sum/3;
	printf("The addition of them is %5d \n",sum);
	printf("The average of them is %5.1f \n",ave); 
	printf(" \n-------分界线7------- \n");
	printf("[%d]\n",123);
	printf("[%.4d]\n",123);
	printf("[%4d]\n",123);
	printf("[%04d]\n",123);
	printf("[%-4d]\n\n",123);
	printf("[%d]\n", 12345);
	printf("[%.3d]\n",12345);
	printf("[%3d]\n",12345);
	printf("[%03d]\n", 12345) ;
	printf("[%-3d]\n\n",12345);
	printf("[%f]\n",123.13);
	printf("[%.1f]\n", 123.13) ;
	printf("[%6.1f]\n\n", 123.13);
	printf("[%f]\n",123.13);
	printf("[%.1f]\n", 123.13);
	printf("[%4.1f]\n\n", 123.13);
	return 0;
} 

  1. ()是优先运算的标记
  2. printf函数输出double值的时候,转换说明不能使用%d,而要使用%f
  3. double类型的变量通过scanf函数赋值的时候需要使用格式字符串%lf
  4. 进行整数/整数运算的时候,商的小树部分会被舍弃,但是浮点数之间的运算,就不会进行舍弃处理
  5. 把2赋给int时,2.5赋给int,赋值的时候会舍弃掉小数点之后的部分,所以都是2
  6. 把2赋给double时,会被解释为2.0,2.5赋给double,会完整保存
  7. int/double结果是double
  8. 类型转换表达式(数据类型)表达式,通常这种形式的表达式会把表达式的值转换为该数据类型对应的值。
  9. %5d...显示至少5位的十进制整数。
  10. %5.1f ...显示至少5位的浮点数。但是,小数点后只显示1位。
  11. 指定显示的最小位数,如果不指定,则整数的时候默认为1,浮点数的时候默认为6
  12. d ... 显示十进制的int型整数。
  13. f ... 显示十进制的double型浮点数。

分支结构

if语句

#include <stdio.h>
int main(void)
{
	printf("-------分界线1------- \n");
	int no;
	printf("Please input a number ");
	scanf("%d",&no);
	
	if(no%5)
	puts("no % 5 is not zero");
	printf(" \n-------分界线2------- \n");	
	int no1;
	printf("Please input a number ");
	scanf("%d",&no1);
	
	if(no1%5)
	puts("no1 % 5 is not zero");
	else
	puts("no1 % 5 is zero");
	printf(" \n-------分界线3------- \n");
	int num;
	printf("Please input a number ");
	scanf("%d",&num);
	if(num){
		puts("The num does not equal with zero"); 
	}else{
		puts("The num equals with zero"); 
	}
	printf(" \n-------分界线4------- \n");
	int n1,n2;
	puts("Please input two numbers ");
	printf("The first number is :"); scanf("%d",&n1);
	printf("The second number is :"); scanf("%d",&n2);
	if(n1==n2)
	puts("The first number equals with the second number");
	else
	puts("The first number does not equal with the second number");
	printf(" \n-------分界线5------- \n");
	int n3,n4;
	puts("Please input two numbers ");
	printf("The first number is :"); scanf("%d",&n3);
	printf("The second number is :"); scanf("%d",&n4);
	if(n3!=n4)
	puts("The first number  does not equal with the second number");
	else
	puts("The first number equals with the second number");
	printf(" \n-------分界线6------- \n");
	int no2;
	printf("Please input a number ");
	scanf("%d",&no2);
	if(no2>0)
		if(no%2==0){
			puts("no2 is an even number");
		}else{
			puts("no2 is an odd number");
		}
	printf(" \n-------分界线7------- \n");
	int n5,n6,max;
	puts("Please input two numbers ");
	printf("The first number is :"); scanf("%d",&n5);
	printf("The second number is :"); scanf("%d",&n6);
	max=(n5>n6)?n5:n6;
	printf("The bigger number is %d \n",max);
	printf(" \n-------分界线8------- \n");
	int month;
	printf("请输入月份: ");
	scanf("%d",&month);
	if (month >= 3 && month <= 5)
	printf("%d月是春季。\n", month);
	else if (month >= 6 && month <= 8)
	printf("%d 月是夏季。\n", month);
	else if (month >= 9 && month <= 11) 
	printf("%d月是秋季。\n", month);
	else if (month == 1|| month == 2|| month == 12) 
	printf("%d 月是冬季。\n", month);
	else
	printf("%d月不存在! !\a\n",month);
	return 0;
} 

  1. if语句判断表达式的值,如果结果不为0,则执行相应的语句
  2. ==运算符会对左右两侧操作数是否相等进行比较
  3. !=运算符会判断两个操作数是否不相等
  4. if语句成为了嵌套的语句这一点和之 前的程序相同,只是嵌套语句的结构不同。
  5. 只有条件运算符属于三目运算符,其他的运算符都是单目或者双目运算符。
  6. 条件运算符a? b : C如果a不为0, 则结果是b的值,否则结果为C的值
  7. a &&b 如果a和b都不为0, 则表达式的结果为1, 否则结果为0 (结果的类型为int)
  8. a||b如果a和b中有一个不为0, 则表达式的结果为1, 否则结果为0 (结果的类型为int)

switch语句

#include <stdio.h>
int main(void)
{
	printf("-------分界线1------- \n");
	int n1;
	printf("Please input a number:");
	scanf("%d",&n1);
	switch(n1 % 3){
		case 0 : puts("n1%3 equals with 0");	break;
		case 1 : puts("n1%3 equals with 1");	break;
		case 2 : puts("n1%3 equals with 2");	break;
	}
	printf(" \n-------分界线2------- \n");	
	int n2;
	printf("Please input a number:");
	scanf("%d",&n2);
	switch(n2){
		case 1: 
		puts("A");
		puts("B");
		break;
		case 2: 
		puts("C");
		case 5: 
		puts("D");
		break;
		case 6: 
		case 7: 
		puts("E");
		break;
		default:
		puts("F");
		break;
	} 
	return 0;
} 
  1. break能让程序调处switch语句
  2. case条件都不满足的时候会跳转default

循环结构

do 语句

#include <stdio.h>
int main(void)
{
	printf("-------分界线1------- \n");
	int retry;
	do{
		int no;
		printf("Please input a number;");
		scanf("%d",&no);
		if(no % 2)
			puts("The number is an odd number");
		else{
			puts("The number is an even number");
		}
		printf("Would you want to try again? Yes...0,No...9 ");
		scanf("%d",&retry);
	} while(retry==0);
	printf(" \n-------分界线2------- \n");	
	
		int choose;
		do{
			printf("Please make a choice【0,1,2】");
			scanf("%d",&choose); 
		}while(choose<0||choose>2);
		
		printf("Your choice");
		switch(choose){
			case 0:printf("0");break;
			case 1:printf("1");break;
			case 2:printf("2");break;
		}
	
	printf(" \n-------分界线3------- \n");	
	int sum=0;
	int cnt=0;
	int retry1;
	do{
		int t;
		printf("Please input a number");
		scanf("%d",&t);
		sum +=t;
		cnt++;
		printf("To continue?Yes..0/No..9");
		scanf("%d",&retry);
	}while(retry==0);
	printf("The addition is %d,The average is %.2f \n",sum,(double)sum/cnt);
	return 0;

} 

while 语句

#include <stdio.h>
int main(void)
{
	printf("-------分界线1------- \n");
	int no;
	printf("Please input a positive number ");
	scanf("%d",&no);
	while(no>=0){
		printf("%d ",no);
		no--;
	}
	printf("\n");
	printf(" \n-------分界线2------- \n");	
	int no1;
	int i;
	printf("Please input a positive number ");
	scanf("%d",&no1);
	i=0;
	while(i<=no1)
	printf("%d ",i++);
	printf("\n");
	printf(" \n-------分界线3------- \n");	
	int no3; 
	printf("Please input a positive number ");	
	scanf("%d",&no3);
	while (no3-->0)
		putchar('*');
	putchar('\n');
	return 0;

} 

for 循环

#include <stdio.h>
int main(void)
{
	printf("-------分界线1------- \n");
	int i,no;
	printf("Please input a positve number ");
	scanf("%d",&no);
	for(i=0;i<=no;i++)
		printf("%d",i);
	putchar('\n');
	return 0;

} 

多重循环

#include <stdio.h>
int main(void)
{
	printf("-------分界线1------- \n");
	int i,j;
	for(i=1;i<=9;i++){
		for(j=1;j<=9;j++)
		printf("%3d",i*j);
		putchar('\n');
	}
	printf("\n-------分界线2------- \n");
	for(i=1;i<=9;i++){
		for(j=1;j<=9;j++){
			int seki = i*j;
			if(seki>40)
			break;
			printf("%3d",seki);
		}
		putchar('\n');
	}
	printf("\n-------分界线3------- \n");
	for(i=1;i<=9;i++){
		for(j=1;j<=9;j++){
			int seki = i*j;
			if(seki%10==4||seki/10==4){
			continue;
		}
			printf("%3d ",seki);
		}
		putchar('\n');
	}
	return 0;

} 

  1. 先循环后判断可以通过do语句来实现,至少执行一次
  2. 先判断后循环可以通过while语句和for语句来实现
  3. break语句会中断该循环语句的执行
  4. continue语句可以跳过本次循环体剩余部分的执行

数组

#include <stdio.h>
int main(void)
{
	printf("-------分界线1------- \n");

    int n,t[10];

    for(n=0;n<10;n++)
        t[n] = n + 1;

    for(n=9;n>=0;n--)
        printf("%d\t",t[n]);

	printf("\n-------分界线2------- \n");

    int i,j,row = 0,colum = 0,max;
    int a[3][4] = {{3,4,16,2},{7,5,1,9},{11,23,3,8}};

    max = a[0][0];
    for(i=0;i<3;i++)
        for(j=0;j<4;j++)
            if(a[i][j]>max)
            {
                max = a[i][j];
                row = i;
                colum = j;
            }

    printf("max=%d\nrow=%d\ncolum=%d\n",max,row,colum);
	return 0;

} 

  1. 同一类型的对象集中在一起,在内存上排列成一条直线,这就是数组
  2. 访问数组的各个元素时使用下标运算符[],下标从0开始
  3. 声明数组时,元素个数必须适用常量表达式
  4. 多维数组的构成元素在排列时,首先从位于末尾的下标开始增加
  5. 无法使用赋值运算符=复制数组的所有元素

字符串和指针

指针

#include<stdio.h>
int main(){
 int a = 100,b = 10;
 int *point_1,*point_2;     //定义指向整型数据的指针变量 point_1,point_2

 point_1 = &a;                 //把变量 a 的地址赋给指针变量 point_1
 point_2 = &b;
 printf("a=%d,b=%d\n",a,b);
 printf("%p,%p\n",point_1,point_2);                     //输出 a 和 b 在内存中的地址
 printf("*point_1=%d,*point_2=%d\n",*point_1,*point_2);    //输出变量 a 和 b 的值

 return 0;
}

字符串

#include <stdio.h>
int main(void)
{
	printf("-------分界线------- \n");
	char str[]="ABC";
	printf("The String str is \"%s\".\n",str);
	printf("\n-------分界线2------- \n");
	char name[48];
	printf("Please input your name");
	scanf("%s",name);
	printf("Hello,%s \n",name);
	return 0;
} 

  1. 通过在指针前写上指针运算符*来访问该指针指向的对象,称为解引用。
  2. 用指针实现字符串”也是一种表示字符串的方法,

文件处理

#include<stdio.h>
#include<stdlib.h>   // stdlib 头文件即 standard library 标准库头文件
int main(){
    FILE * fp;
    char ch,filename[10];
    printf("Please enter the file name:");

    scanf("%s",filename);
    // 如果文件不存在,fopen 会建立该文件
    if((fp=fopen(filename,"w"))==NULL){    // 打开输出文件并使 fp 指向此文件
        printf("Unable to open this file\n");     // 如果打开出错,就输出“打不开”的信息
        exit(0);     // 终止程序
    }

    ch=getchar();     // 用来接收最后输入的回车符
    printf("Please enter a string  in the disk(Ends with a #):");
    ch=getchar();     // 接收从键盘输入的第一个字符
    while(ch!='#'){     // 当输入 # 时结束循环
        fputc(ch,fp);
        putchar(ch);
        ch=getchar();
    }

    fclose(fp);
    putchar(10);
    return 0;
}

  1. 记录控制流所需要的信息的数据类型是FILE型,该数据类型是在<stdio.h>头文件中定义的。
  2. 打开文件的操作称为打开。函数库中的fopen函数用于打开文件。
  3. 使用fopen函数成功打开文件后,返回指向FILE型对象的指针,该对象用于控制与所打开的文件相关联的流;打开操作失败时,返回空指针。
  4. 在文件使用结束后,会断开文件与流的关联,将流关闭。这个操作称为关闭。用于关闭文件的函数是fclose函数。
  5. fscanf函数可以对任意流执行与scanf函数相同的输入操作。二者都返回成功读取的项数。
  6. fprintf函数可以对任意流执行与printf函数相同的输出操作。
  7. fgrtc函数是从任意流读取数据的函数。
  8. fputc函数是向任意流写入数据的函数。

有关【技术积累】C语言基础实战知识【第一版】的更多相关文章

  1. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  2. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  3. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  4. 7个大一C语言必学的程序 / C语言经典代码大全 - 2

    嗨~大家好,这里是可莉!今天给大家带来的是7个C语言的经典基础代码~那一起往下看下去把【程序一】打印100到200之间的素数#includeintmain(){ inti; for(i=100;i 【程序二】输出乘法口诀表#includeintmain(){inti;for(i=1;i 【程序三】判断1000年---2000年之间的闰年#includeintmain(){intyear;for(year=1000;year 【程序四】给定两个整形变量的值,将两个值的内容进行交换。这里提供两种方法来进行交换,第一种为创建临时变量来进行交换,第二种是不创建临时变量而直接进行交换。1.创建临时变量来

  5. postman接口测试工具-基础使用教程 - 2

    1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,

  6. 软件测试基础 - 2

    Ⅰ软件测试基础一、软件测试基础理论1、软件测试的必要性所有的产品或者服务上线都需要测试2、测试的发展过程3、什么是软件测试找bug,发现缺陷4、测试的定义使用人工或自动的手段来运行或者测试某个系统的过程。目的在于检测它是否满足规定的需求。弄清预期结果和实际结果的差别。5、测试的目的以最小的人力、物力和时间找出软件中潜在的错误和缺陷6、测试的原则28原则:20%的主要功能要重点测(eg:支付宝的支付功能,其他功能都是次要的)80%的错误存在于20%的代码中7、测试标准8、测试的基本要求功能测试性能测试安全性测试兼容性测试易用性测试外观界面测试可靠性测试二、质量模型衡量一个优秀软件的维度①功能性功

  7. MIMO-OFDM无线通信技术及MATLAB实现(1)无线信道:传播和衰落 - 2

     MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO

  8. 微信小程序开发入门与实战(Behaviors使用) - 2

    @作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors    1、什么是behaviors    2、behaviors的工作方式    3、创建behavior    4、导入并使用behavior    5、behavior中所有可用的节点    6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors    1、什么是behaviorsbehaviors是小程序中,用于实现

  9. ES基础入门 - 2

    ES一、简介1、ElasticStackES技术栈:ElasticSearch:存数据+搜索;QL;Kibana:Web可视化平台,分析。LogStash:日志收集,Log4j:产生日志;log.info(xxx)。。。。使用场景:metrics:指标监控…2、基本概念Index(索引)动词:保存(插入)名词:类似MySQL数据库,给数据Type(类型)已废弃,以前类似MySQL的表现在用索引对数据分类Document(文档)真正要保存的一个JSON数据{name:"tcx"}二、入门实战{"name":"DESKTOP-1TSVGKG","cluster_name":"elasticsear

  10. ruby-on-rails - CarrierWave - PDF - 只选择第一页 - 2

    我的Rails应用程序中安装了carrierwave。但是,当用户上传多页pdf时,我只希望应用程序获取文档中的第一页并将其转换为jpeg。这可能吗?用什么命令?这是我的uploader。#encoding:utf-8classImageUploader[200,300]##defscale(width,height)##dosomething#end#Createdifferentversionsofyouruploadedfiles:version:thumbdoprocess:resize_to_fill=>[150,210]process:convert=>:jpgdefful

随机推荐