C语言 动态输入字符串

作者 :卿笃军

很多时候,我们不知道要开辟多大的空间,但是我们又想实现无限制的输入~~~

这时候,就需要用到动态空间的开辟了。

先简绍2个函数: malloc()  , realloc()

函数名:malloc

原型:externvoid *malloc(unsigned int num_bytes);

功能:在堆中开辟num_bytes个字节的空间

函数名:realloc

原型:externvoid
*realloc(void *mem_address, unsigned intnewsize);

参数:

mem_address  :  需要追加空间的首地址

newsize            : 需要将空间追加到多大(是指追加后总共的大小,不是指要追加的大小)

realloc()使用注意:

  1. 如果有足够空间用于扩大mem_address指向的内存块,则分配额外内存,并返回mem_address。

    这里说的是“扩大”,我们知道,realloc是从堆上分配内存的,当扩大一块内存空间时, realloc()试图直接从堆上现存的数据后面的那些字节中获得附加的字节,如果能够满足,自然天下太平。也就是说,如果原先的内存大小后面还有足够的空闲空间用来分配,加上原来的空间大小= newsize。那么就ok。得到的是一块连续的内存。

  2. 如果原先的内存大小后面没有足够的空闲空间用来分配,那么从堆中另外找一块newsize大小的内存。

    并把原来大小内存空间中的内容复制到newsize中。返回新的mem_address指针。(数据被移动了)。

    老块被放回堆上。

实例:动态输入字符串

#include <stdio.h>
#include <stdlib.h>

int main()
{
	char ch,*p = (char *)malloc(sizeof(char));  //预开辟一个空间
	int count = 0;

	while ((ch = getchar()) != ‘\n‘)
	{
		p[count] = ch;
		++count;                               //记录需要开辟空间数
		p = (char *)realloc(p,(count+1)*sizeof(char));//开辟空间(realloc返回的地址不一定是原来的地址)
	}                                          //所以这里最好用p[count],而不使用++p;
	p[count] = ‘\0‘;                           //注意尾部

	puts(p);

	free(p);
	p = NULL;

	return 0;
}

C语言 动态输入字符串,布布扣,bubuko.com

时间: 2024-08-09 02:20:36

C语言 动态输入字符串的相关文章

关于指针 用字符数组,字符指针变量输入字符串 动态为字符型指针变量分配内存

#include <stdio.h> #include <iostream> #include<math.h> using namespace std; int main() { //声明字符型数组和指针变量 char str[10]; char *strip=str; //输入输出 cout<<"str="; cin>>str; //用字符数组输入字符串 cout<<"str="<<

C语言实现--&gt;&gt;对输入字符串中各类型出现次数的统计

问题描述: 编写一个程序统计输入字符串中:各个数字.空白字符.以及其他所有字符出现的次数. 代码实现: #include <stdio.h> #include <ctype.h> int main() {  int other=0;  int space=0;  int a[10]={0};  int i=0;  int ch=0;  while ((ch=getchar())!=EOF)  {   /*    //isspace库函数---判断输入字符ch是不是空,如果是,if条

C语言 对输入的一个字符串进行排序

#include <stdlib.h> #include <stdio.h> #include<string.h> void main() { char str[50]; int i,j,len; printf("请输入字符串:"); scanf("%s",str); len=strlen(str);//计算你输入的字符串的长度 if(len>50) { puts("输入的字符大于50!重新输入:");

C语言-对输入的n个字符串进行排序

#include<stdio.h> #include<string.h> #include<stdlib.h> #define N 256 //宏定义 int main() { char strArray[N][256]; char *str[N]; char *temp; int i,n; printf("请输入字符串:\n"); for(i=0;i<N;i++) { gets(strArray[i]); if (strcmp(strArra

C语言-对输入n个字符串进行排序(无导入string.h)

#include <stdio.h> #include "stdlib.h" #define N 256 //宏定义 //比较两个字符串的大小 int str_compare(const char* src,const char* dst) { int ret = 0; if (src == dst) { return 0; } if (dst == NULL) { return -1; } while (!(ret = *(unsigned char*)src - *(u

【C】字符串的输入,求输入字符串中最长的单词

首先,基本目标很简单,就是利用C语言:编写一个函数,输入一行字符,将此行字符中的最长的单词输出. 代码如下: #include<stdio.h> void input(char s[]){ int i=0; for(int c;(c=getchar())!='\n';i++){ s[i]=c; } s[i]='\0';//读取完成,记得对这个字符数组封口 } char* findmax(char s[]){ int max=0,word_length=0,p=0,i=0;//这个p是用来记录最

C语言动态存储分配

动态存储分配 C语言支持动态存储分配,即在程序执行期间分配内存单元的能力,利用动态存储分配,可以根据需要设计扩大(或缩小)的数据结构,虽然可以适用于所有类型的数据,但是动态存储分配更常用于字符串.数组和结构体 本文地址:http://www.cnblogs.com/archimedes/p/c-dynamic-storage-allocation.html,转载请注明源地址. 1.内存分配函数 3种内存分配函数都是声明在<stdlib.h>中: malloc函数--分配内存块,但是不对内存块进

C语言scanf输入格式 printf输出格式

对于刚接触C语言的同学来说 可能会遇到这个问题 因为博主也是个菜鸟经常因为搞不清楚单精度双精度还有输入输出格式的问题 就这个问题也百度的很多次 所以在这里总结一下分享给大家 printf输出格式 1.转换说明符       %a(%A)     浮点数.十六进制数字和p-(P-)记数法(C99)       %c             字符       %d             有符号十进制整数       %f              浮点数(包括float和doulbe)      

C语言数据输入与输出

1 概论 C语言提供了跨平台的数据输入输出函数scanf()和printf()函数,它们可以按照指定的格式来解析常见的数据类型,例如整数,浮点数,字符和字符串等等.数据输入的来源可以是文件,控制台以及网络,而输出的终端可以是控制台,文件甚至是网页. 2 数据输出 从第一个C语言程序中,就使用了跨平台的库函数printf实现将一段文字输出到控制台,而实际上,printf()不仅可以将数据按照指定的格式输出到控制台,还可以是网页或者是指定的文件中,printf()函数执行的返回结果是输出字符的个数.