user-0 提问: 如何用指针数组接收输入的任意个字符串

回复:
user: user-0
content: 引用 16 楼 zhangxiangDavaid 的回复:[quote=引用 14 楼 u013147600 的回复:] [quote=引用 7 楼 zhangxiangDavaid 的回复:] 这样可好：  #include <stdio.h> #include <string.h> #define LINE 5 int i = 0, n = LINE; int l, len; char **str; char buf[100];    //每个字符串100个字符够吗？ int main() { 	//分配原始内存大小 	if (NULL == (str = malloc(sizeof(char*)*n))) 	{ 		fprintf(stderr, "can not malloc(%d*%d)\n", sizeof(char*), n); 		return 1; 	} 	while (1) 	{ 		fgets(buf, 100, stdin); 		if ('\n' == buf[0]) break;     //读入空行，结束 		//内存已满，扩充 		if (i == n) 		{ 			n += LINE; 			if (NULL == (str = realloc(str, sizeof(char*)*n))) 			{ 				fprintf(stderr, "can not realloc(%d*%d)\n", sizeof(char*), n); 				return 1; 			} 		} 		len = strlen(buf); 		buf[len - 1] = 0;  //去'\n' 		if (NULL == (str[i] = malloc(len - 1))) 		{ 			fprintf(stderr, "can not malloc(%d)\n", len - 1); 			return 1; 		} 		strcpy(str[i], buf); 		i++; 	} 	//打印 	for (l = 0; l < i; l++) printf("%s\n", str[l]); 	return 0; } //111111 //222222 //3333333 //44444444 //555555555 //zhangxiang //David // //111111 //222222 //3333333 //44444444 //555555555 //zhangxiang //David  对了，请问下你上面定义的 line变量的作用是什么?没看明白[/quote] 宏LINE是初始字符串个数以及每次的增量[/quote]谢谢哦

user: user-0
content: 引用 17 楼 ForestDB 的回复:还请看malloc的文档。 我知道要动态分配内存可是之前分配不来，总是会出现内存问题

user: user-1
content: 引用 14 楼 u013147600 的回复:[quote=引用 7 楼 zhangxiangDavaid 的回复:] 这样可好：  #include <stdio.h> #include <string.h> #define LINE 5 int i = 0, n = LINE; int l, len; char **str; char buf[100];    //每个字符串100个字符够吗？ int main() { 	//分配原始内存大小 	if (NULL == (str = malloc(sizeof(char*)*n))) 	{ 		fprintf(stderr, "can not malloc(%d*%d)\n", sizeof(char*), n); 		return 1; 	} 	while (1) 	{ 		fgets(buf, 100, stdin); 		if ('\n' == buf[0]) break;     //读入空行，结束 		//内存已满，扩充 		if (i == n) 		{ 			n += LINE; 			if (NULL == (str = realloc(str, sizeof(char*)*n))) 			{ 				fprintf(stderr, "can not realloc(%d*%d)\n", sizeof(char*), n); 				return 1; 			} 		} 		len = strlen(buf); 		buf[len - 1] = 0;  //去'\n' 		if (NULL == (str[i] = malloc(len - 1))) 		{ 			fprintf(stderr, "can not malloc(%d)\n", len - 1); 			return 1; 		} 		strcpy(str[i], buf); 		i++; 	} 	//打印 	for (l = 0; l < i; l++) printf("%s\n", str[l]); 	return 0; } //111111 //222222 //3333333 //44444444 //555555555 //zhangxiang //David // //111111 //222222 //3333333 //44444444 //555555555 //zhangxiang //David  对了，请问下你上面定义的 line变量的作用是什么?没看明白[/quote] 宏LINE是初始字符串个数以及每次的增量

user: user-2
content: 基本原理就是先放缓存，不够存放的时候，长度翻倍

user: user-0
content: 引用 7 楼 zhangxiangDavaid 的回复:这样可好：  #include <stdio.h> #include <string.h> #define LINE 5 int i = 0, n = LINE; int l, len; char **str; char buf[100];    //每个字符串100个字符够吗？ int main() { 	//分配原始内存大小 	if (NULL == (str = malloc(sizeof(char*)*n))) 	{ 		fprintf(stderr, "can not malloc(%d*%d)\n", sizeof(char*), n); 		return 1; 	} 	while (1) 	{ 		fgets(buf, 100, stdin); 		if ('\n' == buf[0]) break;     //读入空行，结束 		//内存已满，扩充 		if (i == n) 		{ 			n += LINE; 			if (NULL == (str = realloc(str, sizeof(char*)*n))) 			{ 				fprintf(stderr, "can not realloc(%d*%d)\n", sizeof(char*), n); 				return 1; 			} 		} 		len = strlen(buf); 		buf[len - 1] = 0;  //去'\n' 		if (NULL == (str[i] = malloc(len - 1))) 		{ 			fprintf(stderr, "can not malloc(%d)\n", len - 1); 			return 1; 		} 		strcpy(str[i], buf); 		i++; 	} 	//打印 	for (l = 0; l < i; l++) printf("%s\n", str[l]); 	return 0; } //111111 //222222 //3333333 //44444444 //555555555 //zhangxiang //David // //111111 //222222 //3333333 //44444444 //555555555 //zhangxiang //David  对了，请问下你上面定义的 line变量的作用是什么?没看明白

user: user-0
content: 引用 11 楼 mewiteor 的回复:#include<stdio.h> #include<stdlib.h> #include<malloc.h> #include<string.h> int main() { 	char *str=NULL,**strs=NULL,*p; 	unsigned int str_size=0,strs_size=0,i; 	do 	{ 		char *tmp=(char*)realloc(str,++str_size*sizeof(char)); 		if(!tmp) 		{ 			free(str); 			fputs("out of memory",stderr); 			return 1; 		} 		str=tmp; 		str[str_size-1]=getchar(); 	}while(str[str_size-1]!='\n'); 	str[str_size-1]=0; 	for(p=strtok(str," \t");p;p=strtok(NULL," \t")) { 		char **tmp=(char**)realloc(strs,++strs_size*sizeof(char*)); 		if(!tmp) 		{ 			free(str); 			free(strs); 			fputs("out of memory",stderr); 			return 1; 		} 		strs=tmp; 		strs[strs_size-1]=p; 	} 	for(i=0;i<strs_size;++i) 		printf("%u:%s\n",i+1,strs[i]); 	free(strs); 	free(str); 	return 0; } 大神呀，测试过可以实现我的要求，谢谢啦

user: user-0
content: 引用 7 楼 zhangxiangDavaid 的回复:这样可好：  #include <stdio.h> #include <string.h> #define LINE 5 int i = 0, n = LINE; int l, len; char **str; char buf[100];    //每个字符串100个字符够吗？ int main() { 	//分配原始内存大小 	if (NULL == (str = malloc(sizeof(char*)*n))) 	{ 		fprintf(stderr, "can not malloc(%d*%d)\n", sizeof(char*), n); 		return 1; 	} 	while (1) 	{ 		fgets(buf, 100, stdin); 		if ('\n' == buf[0]) break;     //读入空行，结束 		//内存已满，扩充 		if (i == n) 		{ 			n += LINE; 			if (NULL == (str = realloc(str, sizeof(char*)*n))) 			{ 				fprintf(stderr, "can not realloc(%d*%d)\n", sizeof(char*), n); 				return 1; 			} 		} 		len = strlen(buf); 		buf[len - 1] = 0;  //去'\n' 		if (NULL == (str[i] = malloc(len - 1))) 		{ 			fprintf(stderr, "can not malloc(%d)\n", len - 1); 			return 1; 		} 		strcpy(str[i], buf); 		i++; 	} 	//打印 	for (l = 0; l < i; l++) printf("%s\n", str[l]); 	return 0; } //111111 //222222 //3333333 //44444444 //555555555 //zhangxiang //David // //111111 //222222 //3333333 //44444444 //555555555 //zhangxiang //David  这么厉害，测试过可以成功，谢谢啦

user: user-3
content: 还请看malloc的文档。

user: user-4
content: c恐怕无法实现，c语言中没有所谓的“无长度要求的字符串”。字符串使用前， 必须得分配内存，如果无法提供确切的长度，字符串是无法分配的。

user: user-5
content: 仅供参考：#include <stdio.h> #include <stdlib.h> #include <malloc.h> int **newarr2d(int rows,int cols) {     int **p,i;      p=(int **)malloc(rows*sizeof(int *));     if (NULL==p) exit(1);     for (i=0;i<rows;i++) {         p[i]=(int *)malloc(cols*sizeof(int));         if (NULL==p[i]) exit(1);     }     return p; } void deletearr2d(int **p,int rows) {     int i;      for (i=0;i<rows;i++) {         free(p[i]);     }     free(p); } int main() {     int **arr2d,i,j,r,c;      r=4;     c=5;     //在堆中开辟一个4×5的二维int数组     arr2d=newarr2d(r,c);     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             arr2d[i][j]=i*c+j;         }     }     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             printf(" %2d",arr2d[i][j]);         }         printf("\n");     }     deletearr2d(arr2d,r);      r=6;     c=3;     //在堆中开辟一个6×3的二维int数组     arr2d=newarr2d(r,c);     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             arr2d[i][j]=i*c+j;         }     }     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             printf(" %2d",arr2d[i][j]);         }         printf("\n");     }     deletearr2d(arr2d,r);      return 0; } //  0  1  2  3  4 //  5  6  7  8  9 // 10 11 12 13 14 // 15 16 17 18 19 //  0  1  2 //  3  4  5 //  6  7  8 //  9 10 11 // 12 13 14 // 15 16 17 //

user: user-0
content: 引用 2 楼 jiqiang01234 的回复:类似这个吗？  char* a[n]; char* p1="hello"; char* p2="world"; char* pn=...  a[0]=p1; a[1]=p2; ... a[n-1]=pn;   不是： 类似这种， 输入n个字符串 char *buf[]; for ( i = 0; scanf("%s", buf[i]); ++i) 	{ 		if(getchar()=='\n') 		{ 			break; 		} } 这个语法是错的，表达下我的意思

user: user-4
content: 类似这个吗？  char* a[n]; char* p1="hello"; char* p2="world"; char* pn=...  a[0]=p1; a[1]=p2; ... a[n-1]=pn;

user: user-0
content: 对了，是用C语言

user: user-6
content: #include<stdio.h> #include<stdlib.h> #include<malloc.h> #include<string.h> int main() { 	char *str=NULL,**strs=NULL,*p; 	unsigned int str_size=0,strs_size=0,i; 	do 	{ 		char *tmp=(char*)realloc(str,++str_size*sizeof(char)); 		if(!tmp) 		{ 			free(str); 			fputs("out of memory",stderr); 			return 1; 		} 		str=tmp; 		str[str_size-1]=getchar(); 	}while(str[str_size-1]!='\n'); 	str[str_size-1]=0; 	for(p=strtok(str," \t");p;p=strtok(NULL," \t")) { 		char **tmp=(char**)realloc(strs,++strs_size*sizeof(char*)); 		if(!tmp) 		{ 			free(str); 			free(strs); 			fputs("out of memory",stderr); 			return 1; 		} 		strs=tmp; 		strs[strs_size-1]=p; 	} 	for(i=0;i<strs_size;++i) 		printf("%u:%s\n",i+1,strs[i]); 	free(strs); 	free(str); 	return 0; }

user: user-0
content: 引用 6 楼 user-7 的回复:你缓存在buf中。一部分一部分的读取不好吗。怎么做呀？我不知道怎么弄

user: user-0
content: 引用 5 楼 jiqiang01234 的回复:c恐怕无法实现，c语言中没有所谓的“无长度要求的字符串”。字符串使用前， 必须得分配内存，如果无法提供确切的长度，字符串是无法分配的。应该是要动态分配内存  可是我弄不来

user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:仅供参考：#include <stdio.h> #include <stdlib.h> #include <malloc.h> int **newarr2d(int rows,int cols) {     int **p,i;      p=(int **)malloc(rows*sizeof(int *));     if (NULL==p) exit(1);     for (i=0;i<rows;i++) {         p[i]=(int *)malloc(cols*sizeof(int));         if (NULL==p[i]) exit(1);     }     return p; } void deletearr2d(int **p,int rows) {     int i;      for (i=0;i<rows;i++) {         free(p[i]);     }     free(p); } int main() {     int **arr2d,i,j,r,c;      r=4;     c=5;     //在堆中开辟一个4×5的二维int数组     arr2d=newarr2d(r,c);     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             arr2d[i][j]=i*c+j;         }     }     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             printf(" %2d",arr2d[i][j]);         }         printf("\n");     }     deletearr2d(arr2d,r);      r=6;     c=3;     //在堆中开辟一个6×3的二维int数组     arr2d=newarr2d(r,c);     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             arr2d[i][j]=i*c+j;         }     }     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             printf(" %2d",arr2d[i][j]);         }         printf("\n");     }     deletearr2d(arr2d,r);      return 0; } //  0  1  2  3  4 //  5  6  7  8  9 // 10 11 12 13 14 // 15 16 17 18 19 //  0  1  2 //  3  4  5 //  6  7  8 //  9 10 11 // 12 13 14 // 15 16 17 // 恩恩 我好好看下

user: user-1
content: 这样可好：  #include <stdio.h> #include <string.h> #define LINE 5 int i = 0, n = LINE; int l, len; char **str; char buf[100];    //每个字符串100个字符够吗？ int main() { 	//分配原始内存大小 	if (NULL == (str = malloc(sizeof(char*)*n))) 	{ 		fprintf(stderr, "can not malloc(%d*%d)\n", sizeof(char*), n); 		return 1; 	} 	while (1) 	{ 		fgets(buf, 100, stdin); 		if ('\n' == buf[0]) break;     //读入空行，结束 		//内存已满，扩充 		if (i == n) 		{ 			n += LINE; 			if (NULL == (str = realloc(str, sizeof(char*)*n))) 			{ 				fprintf(stderr, "can not realloc(%d*%d)\n", sizeof(char*), n); 				return 1; 			} 		} 		len = strlen(buf); 		buf[len - 1] = 0;  //去'\n' 		if (NULL == (str[i] = malloc(len - 1))) 		{ 			fprintf(stderr, "can not malloc(%d)\n", len - 1); 			return 1; 		} 		strcpy(str[i], buf); 		i++; 	} 	//打印 	for (l = 0; l < i; l++) printf("%s\n", str[l]); 	return 0; } //111111 //222222 //3333333 //44444444 //555555555 //zhangxiang //David // //111111 //222222 //3333333 //44444444 //555555555 //zhangxiang //David

user: user-7
content: 你缓存在buf中。一部分一部分的读取不好吗。