精华内容
下载资源
问答
  • 有两个字符串,各有10个字符,是编程完成如下功能: (1)分别找出两个字符串中最大的字符元素; (2)将两字符串对应位置元素逐个比较,并统计输出两个字符串对应元素大于、小于和等于的次数。 2. 销售员业绩管理程序 ...
  • C语言编程小练习8(数组与字符串)

    千次阅读 2018-03-30 14:31:10
    8.1比较两个字符串大小。 ================================================================ 原来代码如图: 原来只是简单的一个小程序,但在GCC 中编译不能通过,警告如下: 查阅C相关函数库得知原因:”...

    C语言编程小练习8(数组与字符串)



    8.1比较两个字符串大小。

    ================================================================
    原来代码如图:
    70
    原来只是简单的一个小程序,但在GCC 中编译不能通过,警告如下:
    70

    查阅C相关函数库得知原因:”由于gets()无法知道字符串的大小,必须遇到换行字符或文件尾才会结束输入,因此容易造成缓存溢出的安全性问题。建议使用fgets()取代。”而GCC认为这个函数比较危险不应该被使用,所以不让使用gets()函数了,puts()函数同样也不支持了,那么还是需要使用以上两个函数的功能怎么办,GCC推荐使用fgets()和fputs()来替代,C语言官方手册也强烈建议用fget()彻底取代gets函数,但是记住,ANSIC并没有将gets从标准中取消掉!

    其使用格式如下:

    #include<stdio.h>
    int main(void)
    {
        char str[10];
        fgets(str, 10, stdin); //stdin 键盘标准输入
        fputs(str, 10, stout); //stdout 标准输出
        return 0;
    }    

    但是编译后又出现新的问题,使用fgets()函数时,若从终端读取一个字符串,回车,原来的gets函数会把最后的换行符\n换为\0,但fgets函数从stdin读入时则不处理\n,所以导致读入的字符多了个\n.

    使用fgets函数不做其他处理运行的问题图

    70

    这个当然也有解决方案:那就是在其中找到\n换行符并替换为\0结束符就可以了, 具体演示在最后代码里。

    用最后代码运行测试图,可以看到是我们预期的运行结果了。
    70

    ================================================================

    最后代码如下:

      1 #include <stdio.h>
      2 #include <string.h>
      3
      4 int main(void)
      5 {
      6     char t1[80], t2[80];
      7     int n;
      8     fputs("Input two character string:\n", stdout); //替代puts函数
      9     fgets(t1, 80, stdin);    //替代gets函数
     10     fgets(t2, 80, stdin);    
     11     if (strlen(t1) != sizeof(t1)-1) //判断是否多了\n
     12     t1[strlen(t1)-1] = '\0';         //将\n 替换为\0
     13     if (strlen(t2) != sizeof(t2)-1)
     14     t2[strlen(t2)-1] = '\0';
     15     n = strcmp(t1, t2);
     16     if (n > 0)
     17         printf("%s > %s\n", t1, t2);
     18     else if (0 == n)
     19         printf("%s = %s\n", t1, t2);
     20     else
     21         printf("%s < %s\n", t1, t2);
     22     return 0;
     23 }


    8.2不调用库函数strcpy, 将以下数组s1中的字符串复制到数组s2中,并输出数组s2中的字符串。
      1 #include<stdio.h>
      2 #include<string.h>
      3
      4 int main(void)
      5 {
      6     char s1[80], s2[80];
      7     int i;
      8     fgets(s1, 80, stdin);
      9     if ( strlen(s1) != sizeof(s1) - 1)
     10     s1[strlen(s1) - 1] = '\0';
     11     for (i = 0; i < strlen(s1)+1; i++)
     12         s2[i] = s1[i];
     13     printf("%s\n", s2);
     14     return 0;
     15 }


    8.3输入10个字符串,输出最大的字符串。
      1 #include<stdio.h>
      2 #include<string.h>
      3 int main(void)
      4 {
      5     char strs[10][20];
      6     char max[20];       //max充当交换数组
      7     int i, n;
      8     printf("Input 10 character strings: \n");
      9     for( i = 0; i < 10; i++)
     10         scanf("%s",strs[i]);
     11     for( i = 0; i < 10; i++) {
     12
     13         n = strcmp(strs[i], strs[i+1]);
     14         if(n > 0)
     15             strcpy(max,strs[i]);
     16         else
     17             strcpy(max,strs[i+1]);
     18     }
     19     printf("max = %s\n", max);
     20     return 0;
     21 }


    8.4判断数组s中的字符串是不是回文。一个字符串从左向右读和从右向左读是一样的,读字符串是回文。例如:字符串“abcdedcba”是回文。
     题目附加信息
    
     char s[80];
    
     gets(s);
    

    1)按题意要求的代码(不推荐,其实为安全考虑应使用fgets函数而不是gets函数):

      1 #include<stdio.h>
      2 #include<string.h>
      3
      4 int main(void)
      5 {
      6     char s[80];
      7     int i, j, n;
      8     printf("Input a character string: \n");
      9     gets(s);
     10     n = strlen(s);
     11     for(i = 0, j = n - 1; i < j; i++, j--)
     12         if(s[i] != s[j])
     13         break;
     14     if(i > j)
     15         printf("回文\n");
     16     else
     17         printf("非回文\n");
     18
     19     return 0;
     20 }

    2)使用fgets函数优化的代码(推荐,避免了gets函数容易造成缓存溢出的问题)

      1 #include<stdio.h>
      2 #include<string.h>
      3
      4 int main(void)
      5 {
      6     char s[80];
      7     int i, j, n;
      8     printf("Input a character string: \n");
      9     fgets(s, 80, stdin);
     10     if ( strlen(s) != sizeof(s) - 1)
     11     s[strlen(s) - 1] = '\0';
     12     n = strlen(s);
     13     for(i = 0, j = n - 1; i < j; i++, j--)
     14         if(s[i] != s[j])
     15         break;
     16     if(i > j)
     17         printf("回文\n");
     18     else
     19         printf("非回文\n");
     20
     21     return 0;
     22 }


    8.5输出数组s中字符串的子串,子串从s[begin]开始,长度为len。

    题目附加信息
    char s[80];
    int begin, len;
    gets(s);
    scanf("%d%d", &begin, &len);
    输入格式:
    How do you do?
    4 9
    输出格式:
    do you do

    1)按题意要求代码(不推荐):

      1 #include<stdio.h>
      2
      3 int main(void)
      4 {
      5     char s[80];
      6     int begin, len;
      7     gets(s);
      8     scanf("%d%d", &begin, &len);
      9     len += begin;
     10     for(; begin < len; begin++)
     11         printf("%c", s[begin]);
     12     printf("\n");
            return 0;
     13 }

    2)fgets函数优化代码(推荐)

      1 #include<stdio.h>
      2 #include<string.h>
      3 int main(void)
      4 {
      5     char s[80];
      6     int begin, len;
      7     printf("Input a character string: \n");
      8     fgets(s, 80, stdin);
      9     if ( strlen(s) != sizeof(s) - 1)
     10     s[strlen(s) - 1] = '\0';
     11     printf("Input position number and character lenth:\n");
     12     scanf("%d%d", &begin, &len);
     13     len += begin;
     14     for(; begin < len; begin++)
     15         printf("%c", s[begin]);
     16     printf("\n");
     17     return 0;
     18 }
    展开全文
  • 比较两个字符串大小3.输出最长的字符串4.统计一个字符串在另外一个字符串出现的次数5.有趣的“回文”检测6.输入一个字符串,将其逆序输出。7.输入一行字符,统计其中的英文字符、数字字符、空格字符,以及其他字符...

    1.十进制转换十六进制

    #include<stdio.h>
    #include<string.h>
    main()
    {
    	char a[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
    	int i=0,n;
    	char b[10];
    	printf("Input n:");
    	scanf("%d",&n);
    	while(n)
    	{
    		b[i++]=a[n%16];
    		n/=16;
    	}
    	b[i]='\0';
    	strrev(b);
    	printf("%s",b);
    }
    

    2.比较两个字符串的大小

    #include <stdio.h>
    int main()
    {
    	int i,d=0;
    	char a[10];
    	char b[10];
    	printf("Please enter two strings.\n");
    	gets(a);
    	gets(b);
    	for(i=1;i<11;i++)
    	{
    		if(a[i]>b[i]) {d=1;printf("s1>s2");break;}
    		if(a[i]<b[i]) {d=1;printf("s1<s2");break;}
    	}
    	if(d==0)printf("s1=s2");
    	return 0;
    }
    

    3.输出最长的字符串

    #include<stdio.h>
    #include<string.h>
    #define N 40
    #define M 80
    main()
    {
    	int i,count,max;
    	char s[N][M];
    	puts("Enter Text Lines,ende with empty line:");
    	count=0;
    	while(count<N)
    	{
    		gets(s[count]);
    		if(!s[count][0])break;
    		count++;
    	}
    	max=0;
    	for(i=1;i<count;i++)
    	{
    		if(strlen(s[i])>strlen(s[max]))
    			max=i;
    	}
    	puts(s[max]);
    }
    

    4.统计一个字符串在另外一个字符串出现的次数

    #include<stdio.h>
    #include<string.h>
    main()
    {
    	char s1[100]="is",s[100]="This is a test!";
    	int i=0,j=0;
    	int count=0;
    	while(s[i])
    	{
    		while(s1[j])
    			if(s1[j++]!=s[i++])break;
    			if(s1[j]=='\0')count++;
    			j=0;
    	}
    	printf("\"%s\"在\"%s\"中出现了%d次。",s1,s,count);
    }
    

    5.有趣的“回文”检测

    #include<stdio.h>
    #include<string.h>
    main()
    {
    	int i,n,d=1;
    	char a[10];
    	printf("Input string:");
    	scanf("%s",a);
    	n=strlen(a);
    	for(i=0;i<(n/2);i++)
    	{
    		if(a[i]!=a[n-i-1]){d=0;break;}
    	}
    	if(d==1)printf("Yes!\n");
    	else printf("No!\n");
    }
    

    6.输入一个字符串,将其逆序输出。

    #include<stdio.h>
    #include<string.h>
    main()
    {
    	int i,n;
    	char a[100],d;
    	printf("Please Enter String1:\n");
    	gets(a);
    	n=strlen(a);
    	for(i=0;i<(n/2);i++)
    	{
    		d=a[i];a[i]=a[n-i-1];a[n-i-1]=d;
    
    	}
    	 printf("Result is:\n%s\n",a);
    }
    

    7.输入一行字符,统计其中的英文字符、数字字符、空格字符,以及其他字符的个数

    .#include <stdio.h> 
    #include <string.h> 
      
    #define ARR_SIZE 80 
      
    main() 
    { 
        char str[ARR_SIZE]; 
        int  len, i; 
        int  letter=0,digit=0,space=0,other=0; 
      
        printf("请输入一个字符串:"); 
        gets(str); 
      
        len = strlen(str);     
      
        for (i=0; i<len; i++) 
        { 
            if (('a'<=str[i]&&str[i]<='z') ||('A'<=str[i]&&str[i]<='Z')) 
            { 
                letter++;    
            }                 
            else if('0'<=str[i]&&str[i]<='9')  
            { 
                digit++;       
            }             
            else if(str[i]==' ')    
            {                    
                space++;      
            }         
            else 
                other++;              
        } 
      
        printf("英文字符数:%d\n", letter); 
        printf("数字字符数:%d\n", digit); 
        printf("空格数:%d\n", space); 
        printf("其他字符数:%d\n", other); 
    }
    

    8.编程实现找出字符串中最大字符元素并输出该元素及其对应的ASCII值

    #include<stdio.h>
    #include<string.h>
    main()
    {
    	int i,n,c;
    	char a[20],d;
    	printf("Input a string:\n");
    	gets(a);
    	n=strlen(a);
    	d=a[0];
    	for(i=1;i<n;i++)
    	{
    		if(a[i]>d){c=i;d=a[i];}
    	}
    	printf("The largest character of \"%s\" is \'%c\' ,The ASCII is %d.",a,a[c],a[c]);
    }
    

    9.字符串逆序

    用字符数组作函数参数编程,利用一个数组实现字符串(允许输入带空格的字符串)的逆序存放。要求如下:
    (1)在主函数中从键盘输入字符串,字符串的最大长度为80个字符。
    调用Inverse()函数将字符串逆序存放,然后在主函数中输出逆序后的字符串。
    (2)在子函数Inverse()中实现字符串的逆序存放。函数原型为:
    void Inverse(char str[]);

    #include<stdio.h>
    #include<string.h>
    void Inverse(char str[]);
    main()
    {
    	char str[20];
    	printf("Input a string:\n");
    	gets(str);
    	Inverse(str);
    	printf("Inversed results:\n");
    	puts(str);
    }
    void Inverse(char str[])
    {
    	int i,n,d;
    	n=strlen(str);
    	for(i=0;i<(n/2);i++)
    	{
    		d=str[i];str[i]=str[n-i-1];str[n-i-1]=d;
    
    	}
    }
    

    10.编程实现从键盘输入5个国名(每个国名最长80个字符)

    找出并输出按字典顺序排在最前面的国名

    #include<stdio.h>
    #include<string.h>
    main()
    {
    	int i,n=0;
    	char a[5][20],d[10];
    	printf("Input five countries' names:\n");
    	for(i=0;i<5;i++)
    	{
    		gets(a[i]);
    	}
    	strcpy(d,a[0]);
    	for(i=1;i<5;i++)
    	{
    		if(strcmp(a[i],d)<0)
    		{
    			strcpy(d,a[i]);
    			n=i;
    		}
    	}
    	printf("The minimum is:%s\n",a[n]);
    }
    

    11.编写函数判断B是不是A的子串(假设A的长度大于B的长度,且两个字符串都不超过100个字符)。注意:串中任意个连续的字符组成的子序列称为该串的子串。

    主函数中输入两个字符串,并调用上述函数判断,然后在主函数中输出”YES”,或者”NO”。

    #include<stdio.h>
    #include<string.h>
    main()
    {
    	char s1[100],s[100];
    	int i=0,j=0;
    	int count=0;
    	printf("Please input the first str:");
    	scanf("%s",s);
    	printf("Please input the second str:");
    	scanf("%s",s1);
    	while(s[i])
    	{
    		while(s1[j])
    			if(s1[j++]!=s[i++])break;
    			if(s1[j]=='\0')count++;
    			j=0;
    	}
    	if(count==0)printf("NO\n");
    	else printf("YES\n");
    }
    

    12.将字符串s1从第m个字符开始剩余的所有字符,送入字符数组s2中。

    **输入格式要求:"%d" 提示信息:“input a string:\n” “input start point:\n”
    **输出格式要求:puts(s2)
    程序运行示例如下:
    input a string:hello,world!
    input start point:7
    world!

    #include<stdio.h>
    #include<string.h>
    main()
    {
    	char s1[100],s2[100]="0";
    	int i,n,m,d=0;
    	printf("input a string:\n");
    	scanf("%s",s1);
    	fflush(stdin);
    	printf("input start point:\n");
    	scanf("%d",&m);
    	n=strlen(s1);
    	for(i=m-1;i<n;i++)
    	{
    		s2[d]=s1[i];
    		d++;
    	}
    	puts(s2);
    }
    

    13.下面的程序将数字进行加密,其中的每一个数字转化为另一个不同的数字

    #include <stdio.h>
    
    main()
    {
        char s[] = "24635", c;
    	int i;
    
        for (i = 0;i<5; i++)
        {
    		c = s[i];
            switch(c)
            {
            case '2':putchar(c+4);break;
            case '3':putchar(c+4);break;
            case '4':putchar(c+4);break;
            case '5':putchar(c+3);break;
            default:putchar(c+2);
            }
            putchar('\n');
        }
    }
    

    14.编写一个程序,将一个字符串s2插入到字符串s1中,其起始插入位置为n。

    **输入插入位置格式要求:"%d"

    #include<stdio.h> 
    #include<string.h> 
    void main() 
    { 
    	char s1[40],s2[20],ch3[20],i,j,temp,x;
    	int n;
    	printf("main string:"); 
    	gets(s1); 
    	printf("sub string:"); 
    	gets(s2); 
    	n=strlen(s1);
        printf("site of begining:(<=%d)",n); 
    	scanf("%d",&i); 
    	temp = i; 
    	for(j=0;s1[temp] != '\0';j++,temp++) 
    		ch3[j] = s1[temp]; 
    	ch3[j]='\0'; 
        for(j=0;j<strlen(s1);j++,i++) 
    		s1[i] = s2[j];  
    	strcat(s1,ch3); 
    	s1[i] = '\0'; 
    	printf("After instert:%s\n",s1);
    }
    

    15.从键盘输入一个字符串(最长不超过80字符),然后从键盘输入一个字符,

    删除字符串中与该字符相同的字符。其中,在字符串中删除与某字符相同的字符,要求用字符数组作函数参数编程实现。已知该函数的原型为:
    void Squeeze(char s[], char c);
    程序运行结果示例:
    Input a string:
    hello, my friend!↙
    Input a character:
    !↙
    Results:hello, my friend

    #include<stdio.h>
    #include<string.h>
    void Squeeze(char a[],char c);
    main()
    {
    	char a[100],c;
    	printf("Input a string:\n");
    	gets(a);
    	printf("Input a character:\n");
    	c=getchar();
    	Squeeze(a,c);
    	printf("Results:%s\n",a);
    }
    
    void Squeeze(char a[],char c)
    {
    	int i,j,n,m,d;
    	n=strlen(a);
    	do{
    		m=0;
    		for(i=0;i<n;i++)
    		{
    			if(a[i]==c)
    			{
    				m=1;
    				for(j=i;j<n-1;j++)a[j]=a[j+1];
    				a[n-1]='\0';
    			}
    			
    		}
    		n=strlen(a);
    	}while(m!=0);
    }
    

    16.//abc*d

    #include<stdio.h>
    #include<string.h>
    void  Squeeze(char a[],char d[]);
    main()
    {
    	char a[100],d[100];
    	printf("请输入需要处理的字符串");
    	gets(a);
    	Squeeze(a,d);
    	printf("处理后的字符串:");
    	puts(d);
    }
    
    void  Squeeze(char a[],char d[])
    {
    	int i,j=0,n;
    	n=strlen(a);
    	for(i=0;i<n;i++)
    	{
    		if(j%2==0)d[i]=a[i];
    		else
    		{
    			d[j]='*';j++;d[j]=a[i];
    		}
    		j++;
    	}
    	d[j]='\0';
    }
    
    展开全文
  • 文章目录一、字符串二、时间复杂度与空间复杂度三、动态内存四、高级指针五、自定义数据类型5.1、结构体5.2、联合体5.3、位域、位段的大小六、文件操作七、可变参数编程与补充 一、字符串 字符串常见问题: strcpy...

    一、字符串

    字符串常见问题:
    strcpy(拷贝)、strlen(求长度)、ctrcmp(比较)、strcat(连接)、atoi、itoa
    strncpy、strncmp、strncat(更安全)、strstr(字符串查找)等相关联问题都是常见且重要问题。
    这里是之前写过的链接:
    字符串的几个应用函数
    字符串函数几种实现方法
    字符串查找:
    BF(朴素查找):数据结构:串的朴素(简单)查找算法
    KMP(改进的字符串匹配算法):KMP算法最浅显理解——一看就明白
     

    二、时间复杂度与空间复杂度

    时间复杂度执行算法所需的计算工作量。一般来说,计算机算法是问题规模n的函数f(n),算法的时间复杂度也因此记做T(n)=O(f(n));常见时间复杂度有:常数阶、线性阶、平方阶、立方阶、对数阶、nlog2n阶、指数阶。
    效率:O(1) > O(log2n)> o(n)> o(nlog2n) > o(n^2) > o(n^3) > o(2^n) > o(n!) > o(n^n)
    时间复杂度实现这个算法所需要的额外的辅助空间
    这里简单举几个例子就好了。
    例1:时间复杂度O(n^3),空间复杂度O(1)

    for (i=1; i<=n; ++i)
    {
    	for(j=1; j<=n; ++j)
    	{
    		c[i][j] = 0;
    		for(k=1; k<=n; ++k)
    		{
    			c[i][j] += a[i][j]*b[k][j];
    		}		
    	}
    }
    

    例2:时间复杂度O(log2n),空间复杂度O(1)

    for (int i=1; i<n; i*=2)
    {
    	++x;
    }
    

    在这里插入图片描述
    例3:时间复杂度O(n^(1/2)),空间复杂度O(1)

    bool Fun(int n)
    {
    	int i = 2;
    	while ((n%i)!=0 && i<sqrt(n) )
    	{
    		i++;
    	}
    
    	if (i > sqrt(n))
    		return true;
    	else
    		return false;
    }
    

    例4:递归的时间复杂度可以倒过来看

    int Fun1(int n)//时间复杂度O(n),空间复杂度O(n)
    {
    	if (n <= 1)  return n;
    	else return Fun1(n-1) + 1;
    }
    int Fun2(int n)//时间复杂度O(n),空间复杂度O(n)
    {
    	if (n <=1)  return n;
    	else return Fun2(n-2) + 2;
    }
    int Fun3(int n)//时间复杂度O(n),空间复杂度O(n)
    {
    	if (n <=1)  return n;
    	else return Fun3(n-10) + 1;
    }
    int Fun4(int n)//时间复杂度O(log2n),空间复杂度O(n)
    {
    	if (n <=1)  return n;
    	else return Fun4(n/2) + 1;
    }
    

     

    三、动态内存

    动态内存几个重要函数:malloc、calloc、realloc、free
    1.malloc:向内存申请了一块连续可用的空间,并且返回指向这块空间的指针。

    void* malloc (size_t size); 
    

    如果开辟成功,则返回一个指向开辟好空间的指针。
    如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做好检查。
    返回值类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候由使用者自己来决定。
    如果参数size为0,malloc的行为是标准未定义的,取决于编译器。
    2.free:用来做动态内存的释放和回收的,free函数用来释放动态开辟的内存。

    void free (void* ptr);
    

    如果参数 ptr 指向的空间不是动态开辟的,那free函数行为是未定义的。
    如果参数 ptr 是NULL指针,则函数什么事都不做。
    3.calloc:对申请的内存空间的内容要求初始化

    void* calloc (size_t num, size_t size)
    

    函数的功能是为 num 个大小为 size 的元素开辟一块空间,并且把空间的每个字节初始化为0。
    与函数 malloc 的区别只在于 calloc 会在返回地址之前把申请的空间的每个字节初始化为全0。
    4.realloc:realloc则对malloc申请的内存进行大小的调整。

    void* realloc (void* ptr, size_t size); 
    

    ptr是要调整的内存地址。
    size是调整之后的新大小。
    返回值为调整之后的内存起始位置。
    这个函数调整原内存空间大小的基础上,还会将原来内存中的数据移动到新的空间。

    参考博客:malloc、calloc、realloc的区别
    动态内存管理(malloc,calloc,realloc)
    C—动态内存分配之malloc ,realloc及calloc的区别
     

    四、高级指针

    指针数组:是一个数组,每个格子保存一个指针。
    数组指针:指向数组的指针。
    指针函数:返回指针的函数。
    函数指针:指向函数的指针。

    举个例子来看:

    int Max(int a,int b)
    {
    	return a>b?a:b;
    }
    int Min(int a,int b)
    {
    	return a<b?b:a;
    }
    int main()
    {
    	int *e[10];//指针数组:是一个数组每个格子保存一个整型指针。40个字节
    	int (*f)[10];//数组指针:指向数组的指针。                  4个字节
    	int *g(int,int);//指针函数:返回指针的函数。
    	int (*h)(int,int);//函数指针:指向函数的指针。
    	h = &Max;//函数指针
    	printf("%d\n",(*h)(10,20));//函数指针
    	h = Min;//函数名是函数的入口地址,函数指针。
    	printf("%d\n",h(100,200));//函数指针
    }
    

    变量总结:
    在这里插入图片描述
     

    五、自定义数据类型

    5.1、结构体

    结构体大小内存对齐问题:各种数据存放的地址要能够整除该数据本身的字节数.例如:char可存放在任意地址,short存放在能被2整除的地址,int存放在能被4整除的地址…
    结构体大小:总大小一定要为单个最大类型的倍数
    这里简单举几个例子:

    struct A
    {
    	char a;//1+3补齐
    	int b;//4
    };//总共8个字节
    
    struct B
    {
    	char a;//1+1
    	short b;//2
    	int c;//4
    };//总共8个字节
    
    struct C
    {
    	int a;//4
    	char b;//1
    };//5+3,总共8个字节
    

    特殊情况1:若在C++中:静态成员不算大小

    struct E
    {
    	char a;//1
    	int b;//4
    	static double c;//不算
    };//总共8个字节
    

    特殊情况2:#pragma pack()//修改对齐方式,一般不用。

    #pragma pack(1)//修改对齐方式
    struct A
    {
    	char a;//1
    	int b;//4
    };//总共5个字节
    

    更多详细例子可参考:结构体的大小甄别

    结构体与类的区别:默认权限:class默认的是private,strcut默认的是public。

    5.2、联合体

    联合体:共用低地址。
    如下图所示:

    union F
    {
    	char a;
    	short b;
    };//总共2个字节,只要能存下最大的就可以
    

    引申出来一个问题:如何判断当前系统是否为大小端?
    小端:低地址放小数据。大端:低地址放大数据。

    union F
    {
    	char a;
    	short b;
    };//总共2个字节,只要能存下最大的就可以
    
    bool IsLittle()///判断当前系统是否为小端
    {
    	union F sa;
    	sa.b = 0x1234;
    	return sa.a == 0x34;//判断低地址数据是否为小数据
    }
    

    我们可以采用联合体帮助我们。首先定义一个联合体,获取它的低地址,若低地址为小数据则为小端;否则为大端。

    5.3、位域、位段的大小

    位域:有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位,基本不用。
    位域大小:整型大小的倍数。

    struct G//位段
    {
    	int a:7;//a占7个位
    	int b:8;//b占8个位
    };//15个位,2个字节,总共为4个字节。
    
    struct G//位段
    {
    	int a:7;//a占7个位
    	int b:8;//b占8个位
    	int d:23;//d占23个位
    };//总共8个字节
    

     

    六、文件操作

    这里主要是一个问题:求一个文件的大小,即占用的字节数。
    解题思路:
    ①按二进制只读方式打开文件。
    ②利用fseek将文件位置标记指向文件的结尾。
    ③利用ftell获取文件的位置根据返回值就能得到文件大小。
    ④关闭文件。

    int main()
    {
    	FILE *fr = fopen("1.cpp","rb");
    	fseek(fr,0,SEEK_END);
    	long sz = ftell(fr);
    	printf("该文件一共有%ld个字节\n",sz);
    	fclose(fr);
    
    	return 0;
    }
    

    这些博客写的很详细了:
    c语言关于文件操作的常用函数(新手入门看)
    C语言文件操作
    【C语言】文件常用读写操作(含读取学生信息示例)

    七、可变参数编程与补充

    可变参数编程三个宏:va_start(开始),va_arg(取数据),va_end(结束);
    之前写过一篇博客里面有许多例子:可变参数编程问题探究

    最后补充4个函数:
    1.rand():C语言中用来产生一个随机数的函数。
    rand:返回一个伪随机数。之所以说是伪随机数,是因为在没有其它操作下,每次执行同一个程序,调用rand得到的随机数序列是固定的(不是真正的“随机”)。为了使rand的结果更“真”一些,也就是令其返回值更具有随机性。C语言在stdlib.h中还提供了srand函数,通过该函数可以设置一个随机数种子,一般用当前时间的毫秒数来做参数。通过time(NULL)可以获取到当前时间的毫秒值(该函数位于time.h)中。
    使用rand的流程可以总结为:
    1 调用srand(time(NULL))设置随机数种子。
    2 调用rand函数获取一个或一系列随机数。
     
    2.sprintf():把格式化的数据写入某个字符串。
    头文件:stdio.h
    函数原型:int sprintf( char *buffer, const char *format [, argument] … );
    返回值:字符串长度(strlen)
       sprintf 与printf 在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,后者则直接在命令行上输出。
    输出格式控制:
          %% 印出百分比符号,不转换。
          %c 整数转成对应的 ASCII 字元。
          %d 整数转成十进位。
          %f 倍精确度数字转成浮点数。
          %o 整数转成八进位。
          %s 整数转成字符串。
          %x 整数转成小写十六进位。
          %X 整数转成大写十六进位。
     
    3.memcpy: 内存拷贝函数。
    功能:是从源内存地址的起始位置开始拷贝若干个字节到目标内存地址中。从源source所指的内存地址的起始位置开始拷贝n个字节到目标destin所指的内存地址的起始位置中。
    函数原型:void *memcpy(void *destin, void *source, unsigned n);
    参数:
    destin:指向用于存储复制内容的目标数组,类型强制转换为 void * 指针。
    source:指向要复制的数据源,类型强制转换为 void * 指针。
    n:要被复制的字节数。
     
    4.memset:初始化函数。作用是将某一块内存中的内容全部设置为指定的值, 这个函数通常为新申请的内存做初始化工作。
    函数原型:void *memset(void *s, int ch, size_t n);
    函数解释:将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。
    memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法 [1] 。
    memset()函数原型是extern void *memset(void *buffer, int c, int count) buffer:为指针或是数组,c:是赋给buffer的值,count:是buffer的长度。

    展开全文
  • C语言编程要点

    2017-09-18 00:10:37
    12.5. 对字符串进行操作的标准库函数有哪些? 173 12.6. 对内存进行操作的标准库函数有哪些? 176 12.7. 怎样判断一个字符是数字、字母或其它类别的符号? 178 12.8. 什么是“局部环境(locale)”? 179 12.9. 有没有办法...
  • 输入5个字符串(长度小于10),比较大小,将最大串和最小串连接,大串在前,小串在后
  • ,输入字符串,用gets比较好(gets从标准输入设备读字符百串函数,其可以无限读取,不会判断上限,以回车结束读取,所以编程时应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。) 这题比较简单,就是统计输入...

    题目要求

    编写一个函数 strlong(),返回2个字符串中较长的一个

    思路分析 

    涉及到字符串长度的问题,得用到头文件#include<string.h>,输入字符串,用gets比较好(gets从标准输入设备读字符百串函数,其可以无限读取,不会判断上限,以回车结束读取,所以编程时应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。) 这题比较简单,就是统计输入字符穿长度,用函数判断大小,返回值,然后打印结果

     撸写代码

    #include<stdio.h>
    #include<string.h>
    char *strlong(char *str1,char *str2) //函数的返回指针char*(指针) 
    {
    	printf("str1的长度%d,str2的长度%d",strlen(str1),strlen(str2));
    	if("strlen(str1)>=strlen(str2)")
    	{
    		return str1;
    	}
    	else
    	{
    		return str2;
    	}
    }
    int main()
    {
    	char str1[30],str2[30],*str; //*str是指针类型,指向一个字符串 
    	printf("\n请输入第一个字符串:");
    	gets(str1);
    	printf("\n请输入第二个字符串:");
    	gets(str2);
    	str=strlong(str1,str2);
    	printf("\n较长的是%s\n",str);
    	return 0;
    }
    

    测试结果

    展开全文
  • 问题描述:C语言中存在字符串,但其并未定义字符串类型,为便于编程人员更好操作字符串C语言库 函数中提供了许多字符串处理函数,如:strcat函数(将目标串的内容追加到原串中),strcmp(比较两个字符串大小)...
  • varchar2 1~4000字节 可变长度字符串,与CHAR类型相比,使用VARCHAR2可以节省磁盘空间,但查询效率没有char类型高 数值类型 Number(m,n) m(1~38) n(-84~127) 可以存储正数、负数、零、定点数和精度为38位的浮点数...
  • 用字符数组或指针做函数参数设计函数,比较两个字符串大小,实现类似于strcmp()函数的功能。 13.设计函数,对一组数排序,用数组或指向数组的指针变量做函数参数。 14.编写程序完成如下功能:根据输入m的值,2,在m...
  •  关键字是由C语言规定的具有特定意义的字符串,通常也称为保留字。用户定义的标识符不应与关键字相同。C语言的关键字分为以下几类: (1)类型说明符 用于定义、说明变量、函数或其它数据结构的类型。如前面例题...
  • c语言经典案例

    2014-10-30 08:06:57
    实例097 计算字符串中有多少个单词 126 实例098 不使用strcpy()函数实现 字符串复制功能 127 实例099 逆序存放数据 129 实例100 相邻元素之和 130 实例101 选票统计 131 实例102 使用数组统计学生成绩 132 实例103 ...
  • 比较字符串大小的函数讲解函数的封装以及一些注意事项。 库函数和自定义函数 C语言自带的函数称为库函数(Library Function)。库(Library)是编程中的一个基本概念,可以简单地认为它是一系列函数的集合,在...
  • 编程如下: void main() { int i,j,s=0,l,v[3],a[5][3]; printf("input score\n"); for(i=0;i;i++){ for(j=0;j;j++) { scanf("%d",&a[j][i]); s=s+a[j][i];} v[i]=s/5; s=0; } l=(v[0]+v[1]+v[2])/3; printf("math:%...
  • C语言常用算法

    2012-03-28 10:48:37
    191 比较字符串长度 192 合并整数 193 矩阵逆置 194 删除指定的字符 195 括号匹配 196 字符串逆置 197 SIX/NINE问题 198 单词个数统计 199 方差运算 200 级数运算 201 输出素数 202 素数题 203 序列排序 ...
  • 忽略大小写比较字符串大小,大写字母和小写字母之间ASCII码差32,若第一个字符不一样,比较其字符ASCII即可,若一样,则一直找到第一个不一样的进行比较。 遇到了一道阴间改错,即输出字符串中连续出现两次以上的...
  • C语言学习实例220例

    2015-06-16 23:47:59
    191 比较字符串长度 192 合并整数 193 矩阵逆置 194 删除指定的字符 195 括号匹配 196 字符串逆置 197 SIX/NINE问题 198 单词个数统计 199 方差运算 200 级数运算 201 输出素数 202 素数题 203 序列排序 204 整数...
  • C语言实例解析精粹

    2014-03-14 21:57:05
    191 比较字符串长度 192 合并整数 193 矩阵逆置 194 删除指定的字符 195 括号匹配 196 字符串逆置 197 SIX/NINE问题 198 单词个数统计 199 方差运算 200 级数运算 201 输出素数 202 素数题 203 序列排序 ...
  • /*输入2个字符串,输出2个字符串中较短串的长度。*/ /*从键盘上给一个5*5整型数组输入值,找出对角线上其值最的元素。*/ 编程,程序的功能是:从键盘上循环输入某课程的平时、实习、测验和期末成绩, 按10%,20...
  • C语言实例解析精粹 PDF

    热门讨论 2010-08-17 00:20:25
    实例191 比较字符串长度 实例192 合并整数 实例193 矩阵转置 实例194 删除指定的字符 实例195 括号匹配 实例196 字符串逆置 实例197 SIX/NINE问题 实例198 单词个数统计 实例199 方差运算 实例200 级数运算 实例201 ...
  • C语言的科学和艺术.pdf

    热门讨论 2012-01-19 14:09:05
    9.4.6 比较两个字符串 251 9.4.7 在一个字符串内搜索 252 9.4.8 大小写转换 255 9.4.9 数值转换 255 9.4.10 效率和strlib.h库 257 小结 257 复习题 258 程序设计练习 260 第10章 模块化开发 264 10.1 pig ...
  • 1.编程实现:对任意一个一维数组,从中找出数组元素的最大值和最小值。 2.编程实现:在给定的字符串中查找满足条件的第一个字符。 3.编程实现:首先任意输入一个大于...编写函数cmpStr()用于判断两个字符串大小
  • C语言实现的LCD数学

    千次阅读 2012-12-08 15:05:03
    好像用C语言比较麻烦,因为要涉及到字符串的应用,用C++或Java之类的可能更简单些,但算法一样、 #include #include int size=5,count;//size是改变数字的大小 //flag代表每个数字对应h,v,h,v,h的值. ...
  • C语言】我解决了输入中文判断中文的问题!一个简单的扑克牌管理查询系统(CodeBlocks) PS:编程环境为Codeblocks 前言 老师又双叒叕不做人了!...if(strcmp("针不戳", "真不错") == 0) /*比较字符串是否相等*/ {
  • 执行部分的第一行是输出语句,调用printf函数在显示器上输出提示字符串,请操作人员输入自变量x的值。第二行为输入语句,调用scanf函数,接受键盘上输入的数并存入变量x中。第三行是调用sin函数并把函数值送到变量s...
  • 191 比较字符串长度 192 合并整数 193 矩阵逆置 194 删除指定的字符 195 括号匹配 196 字符串逆置 197 SIX/NINE问题 198 单词个数统计 199 方差运算 200 级数运算 201 输出素数 202 素数题 203 序列排序 ...
  • C语言接口与实现:创建可重用软件的技术.pdf

    千次下载 热门讨论 2011-09-30 17:46:11
    C语言接口与实现:创建可重用软件的技术》,原名《C Interfaces and Implementations:Techniques for Creating Reusable Software》,作者:【美】David R.Hanson,翻译:傅蓉 周鹏 张昆琪 权威,出版社:机械工业...
  • C语言源代码实例.rar

    2009-08-27 20:17:58
    191 比较字符串长度 192 合并整数 193 矩阵逆置 194 删除指定的字符 195 括号匹配 196 字符串逆置 197 SIX/NINE问题 198 单词个数统计 199 方差运算 200 级数运算 201 输出素数 202 素数题 203 序列排序 ...
  • 实例27 字符替换 实例28 从键盘读入实数 实例29 字符行排版 实例30 字符排列 实例31 判断字符串是否回文 实例32 通讯录的输入输出 实例33 扑克牌的结构表示 实例34 用“结构”统计学生成绩 实例35 ...

空空如也

空空如也

1 2 3 4 5 6
收藏数 109
精华内容 43
关键字:

c语言比较字符串大小编程

c语言 订阅