7.82 指针练习之,输入任意个谚语,将它们存入执行时期分配的内存中,然后由短到长地排序

#define __STDC_WANT_LIB_EXT1__ 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

#define BUFFER_LEN 5 //初始化输入缓冲长度
#define BUFFER_LEN_INCR 3//缓冲长度增长量
#define CAPACITY_INCR 2 //对于要输入的谚语的增长容量

int main(void)
{
    char **pProverbs=NULL; //指向谚语字符串的指针
    char **temp=NULL; //临时指针
    size_t *pLengths =NULL; //谚语长度的指针
    size_t *ptemplengths =NULL;//临时长度指针
    int capacity = 0; //能够存储谚语的数目
    int count =0; //读入谚语的数目
    char *pstart =NULL; //指向缓冲输入的开头指针
    char *pstr = NULL; //指向一个字符串的指针
    int buffer_length =BUFFER_LEN; //输入缓冲长度

    char *pbuffer = (char*) malloc(BUFFER_LEN);//初始化缓冲区的内存分配,注意,这是一维的数组
    if(!pbuffer)
    {
        printf("bullshit\n");
        exit(1);
    }

    pstart = pbuffer;//存储缓冲区的开头
    for(;;)
    {
        //1.确定存多少句谚语。
        //是否存满了容量
        if(count == capacity)
        {
            capacity += CAPACITY_INCR;//每次增加两个谚语容量
            temp = realloc(pProverbs,capacity*sizeof(char*));//重新开辟新内存给pProverbs,指定char*类型指针,数量为capacity
            if(!temp)
            {
                printf("bullshit!\n");
                exit(1);
            }
            pProverbs = temp;
            temp =NULL;

            ptemplengths = realloc(pLengths,capacity*sizeof(size_t));//
            if(!ptemplengths)
            {
                printf("bullshit!\n");
                exit(1);
            }
            pLengths = ptemplengths;
            ptemplengths=NULL;
        }

        printf("Enter a proverb and press Enter, or just press Enter to end:\n");

        //2.确定每句谚语的输入存到动态分配的内存中
        //阅读设备输入的谚语了
        while((*pbuffer++ = getchar())!=‘\n‘)//一维的数组元素录入
        {
            if(pbuffer-pstart == buffer_length)
            {
                buffer_length += BUFFER_LEN_INCR;  //增加缓冲长度
                pstr = realloc(pstart,buffer_length);//重新分配新缓冲的内存
                if(!pstr)
                {
                    printf("bullshit!\n");
                    exit(1);
                }

                //新内存包含了当前谚语文本,但能够成为一个与pstart不相同的地址
                //我们一定要重置pbuffer的指针,到同样相关地址的新内存。
                //正如它在旧内存,pstart应该指向新缓冲
                pbuffer =pstr+(pbuffer-pstart);//新内存中下一个位置的地址
                pstart = pstr;
                pstr =NULL;
            }
        }

        //3.如果是空的就退出。
        if((pbuffer-pstart)<2)
            break;

        //4.把当前输入好的谚语字符串存入二维元素中。为何+1
        *(pbuffer-1)  = ‘\0‘;
        pbuffer = pstart;
        *(pLengths + count) = strnlen_s(pbuffer,buffer_length);//例如你输入a,长度就是1
        //printf("%d\n",*(pLengths + count));
        if(!(*(pProverbs+count)=(char*)malloc(*(pLengths+count)+1)))//但这里开辟空间就要预留\0字符
        {
            printf("bullsht!\n");
            exit(1);
        }
        strcpy_s(*(pProverbs+count),*(pLengths+count)+1,pbuffer);
        ++count;
    }

    size_t length = 0;
    for(size_t i = 0;i<count-2;++i)
    {
        for(size_t j = i+1;j<count-1;j++)
        {
            if(*(pLengths+i)>*(pLengths+j))
            {
                pstr = *(pProverbs+i);
                *(pProverbs+i) = *(pProverbs+j);
                *(pProverbs+j) = pstr;

                length = *(pLengths+i);
                *(pLengths+i) = *(pLengths+j);
                *(pLengths +j) = length ;
            }
        }
    }

    printf("\nAll:\n");
    for(size_t i = 0;i<count;++i)
    {
        printf("%s\n",*(pProverbs+i));
        free(*(pProverbs+i));
        *(pProverbs+i)=NULL;
    }

    free(pProverbs);
    free(pstart);
    free(pLengths);
}
时间: 2025-01-02 16:10:31

7.82 指针练习之,输入任意个谚语,将它们存入执行时期分配的内存中,然后由短到长地排序的相关文章

【原创】二级指针中在内存中的样子

长话短说,只要能理解指针,基本上二级指针就很好理解了. 看看下面的栗子: int a,b; int array[10]; int *pa; pa=&a; //&a 是一个指针表达式. Int **ptr=&pa; //&pa 也是一个指针表达式. *ptr=&b; //*ptr 和&b 都是指针表达式. pa=array; pa++; //这也是指针表达式. OK.如果你还不理解就调试一下,看看内存中的样子和汇编就明白了. 00BE3C05 89 45 FC

输入任意一个5位数,判断其是否是回文数

输入任意一个5位数,判断其是否是回文数.所谓的回文数是指其个位与万位相同,并且十位与千位相同,比如:12321或者54645: #include <stdio.h>void main(){   int n=0;    printf("请输入任意一个5位数\n");    scanf("%d",&n);   n%10==n/10000&&(n/10)%10==(n/1000)%10 ? printf("%n是一个回文数&q

48.输入任意正整数,编程判断该数是否为回文数(回文数是指从左到右读与从右到左读一样,如12321)

//1.输入一个数,将其每一位分离,并保存如一个数组 //2.判断数组最后录入的一位是第几位 //3.循环判断是否满足回问数的要求 #include<iostream> using namespace std; int main() { int n,temp; int k=0; int a[20]; cout<<"please input an number: "<<endl; cin>>n; for(int i=0;i<20;i+

输入任意一个年份,判断其是否是闰年

#include <stdio.h>void main(){   int year;   printf("请输入一个年份:");    scanf("%d",&year);   year%4==0&&year%100!=0||year%400==0 ? printf("该年份是闰年"):printf("该年份不是闰年");    printf("\n"); } 输入任意一

用指针对字符串输入/输出

#include<iostream> using namespace std; int main(void) { char *s=new char[80]; cout<<"输入一个字符串: "; cin>>s; getchar(); cout<<"输入的字符串是:"; cout<<s; getchar(); delete []s; s=NULL; } s是一个字符型指针变量,通过new运算符申请一个动态数组

输入任意一个字符串,如:“abDEe23dJfd343dPOddfe4CdD5ccv!23rr”。 取出该字符串中所有的字母组成一个新的字符串。

#include <stdio.h>#include <string.h> /*输入任意一个字符串,如:“abDEe23dJfd343dPOddfe4CdD5ccv!23rr”. 取出该字符串中所有的字母组成一个新的字符串.*/ void main(){ char oldStr[100] = "abDEe23dJfd343dPOddfe4CdD5ccv!23rr"; char newStr[100]; int i = 0,j = 0; for(i = 0; i

C语言 输入任意字符串将其中的小写字母变大写字母

#include<stdio.h>void main() { char c[]={0}; char d[]={0}; int i,k,j=0; printf("请输入任意的字符串:"); scanf("%s",c) ; k=strlen(c); for(i=0;i<k;i++) { if(c[i]>='a'&&c[i]<='z') { d[j]=c[i]-32; j++; } if(d[i]>='A'&&a

输入任意一个5位数,判断其是否是回文数。

#include <stdio.h>void main(){ int a; printf("请输入一个5位数"); scanf("%d",&a); (a/10000==a%10&&(a/1000)%10==(a/10)%10)?printf("是回文数\n"):printf("不是回文数\n");} 输入任意一个5位数,判断其是否是回文数.,布布扣,bubuko.com

53.从键盘输入任意一串字符串,程序输出同样的一串字符,要求输出字符串中大小写相互转化,其他符号不变。如输入“a123BxC”,则输出“A123bXc”

(1)我的错误程序: #include<iostream> #include<string.h> using namespace std; int ZhuanHuan(char); int main() { char a[100]; cout<<"please input a string: "<<endl; cin>>a; for(int i=0;i<strlen(a);i++) { ZhuanHuan(a[i]);