题目:有一段文本,将文本中的所有单词,存放到一个字符指针数组中(要求每个单词内存恰好)。

- 第一种做法 
- char c[] = " asd afil kjgl rip kjgdr gds sdg gs "; 
- char b[10] = {0}; 
- char *a[10] = {NULL}; 
- int i = 0, j = 0,k = 0; //i使字符不断后移,j用来标识指针a,k用来标识中间字符数组b; 
- while (1) {//把字符串的'\0' 作为if判断的条件,避免遇到\0不在判断 
- if (c[i] != ' ' && c[i] != '\0') { 
- b[k++] = c[i++]; 
- continue; //提高效率,当进行此if判断时,就不在进行一下if判断 
- } 
- if ((c[i] == ' ' || c[i] == '\0') && k != 0) { 
- //k判断是否有字符赋给b数组,没有的话意味着前面是空空格,就不在需要进行判断,提高运行效率 
- b[k] = '\0'; //给数组b加上\0 ,结束字符 
- a[j] = malloc(strlen(b) + 1); //为指针开辟空间 
- strcpy(a[j], b); //b是首地址,a[j]也是首地址,函数具有复制功能,如:%s 
- k = 0; 
- j++; 
- } 
- if (c[i] == '\0') { //把while中的\0判断移到可以先判断\0的情况 
- break; 
- } 
- i++; 
- } 
- for (int i = 0 ; i < j ; i++ ) { 
- printf("%s\n", a[i]); //int a = 10; int *b = null; b = &a; *b = 10; 
- free(a[i]); //* 具有指向功能, 
- a[i] = NULL; 
- } 
- 第二种做法 
- char str[] = " a41 a1421 b3511 b b c c c c dddddd jkthku"; 
- //2.如何存储一个单词? 
- char tempStr[20] = {0}; //存储文本中的一个单词 
- //3.如何存储堆区空间的地址? 
- char *p[255] = {0}; 
- //4.如何查找单词,并且将对应的单词存放到临时数组中? 
- int i = 0; //标识str字符串中字符的下标 
- int j = 0; //标识tempStr字符串中字符的下标 
- int k = 0; //标识指针数组中元素的下标. 
- while (1) { 
- if (str[i] != ' ' && str[i] != '\0') { 
- //当获取到的元素不为空格时,将它存储到临时数组tempStr中. 
- tempStr[j++] = str[i]; 
- } else if (j != 0) { 
- //当遇到空格,或者遇到\0时.单词的存放结束 
- tempStr[j] = '\0'; //最后一个元素补上\0 
- //动态计算所需堆区空间的大小,将地址存放到对应的字符指针数组元素中 
- p[k] = malloc(strlen(tempStr) + 1); 
- //将临时数组tempStr中字符串拷贝到对应堆区空间上. 
- strcpy(p[k], tempStr); 
- k++; 
- j = 0; //存储下一单词时,又从数组的第一个字符开始. 
- } 
- //当读取到\0时,字符串读取完毕,跳出循环 
- if (str[i] == '\0') { 
- break; 
- } 
- i++; //移动到str数组中的下一个元素 
- } 
- for (int i = 0; i < k; i++) { 
- printf("%s ", p[i]); 
- free(p[i]); 
- p[i] = NULL; 
- } 
- 第三种做法 
- char str[50] =" qwo shi shui nishi hhdj"; 
- char temp[20] = {0}; 
- char *p[10] = {0}; 
- int count = 0; 
- int d = 0,i = 0,index = 0,h = 0; 
- while (str[i] != '\0') { 
- if (str[i] != ' ') { 
- count ++; 
- i ++; 
- index = i - count; 
- } 
- if (str[i] == ' ' || str[i] == '\0' ){ 
- if (count != 0) { 
- int k = 0; 
- for (int j = index; j < i;j ++) { 
- temp[k] = str[j]; 
- k ++; 
- d = k; 
- } 
- temp[k] = '\0'; 
- printf("%s\n",temp); 
- p[h] = malloc(count + 1); 
- strcpy(p[h], temp); 
- h ++; 
- count = 0; 
- } 
- i ++; 
- } 
- } 
- for (int i = 0; i < h; i ++) { 
- printf("%s ",p[i]); 
- free(p[i]); 
- p[i] = NULL; 
- } 
- 第四种做法 
- char a[] = " The end of the World Cup does not mean the end of international competition in Brazil this year"; 
- char *p[100] = {0}; //记录单词 
- char temp[100] = {0}; //临时记录单词 
- int i = 0; //记录a[]数组元素的位置 
- int j = 0; //记录单词的个数 
- int k = 0; //记录temp[]数组中临时单词的字母个数(元素位置) 
- int count = 0; 
- while (a[i] != '\0') { 
- if ((a[i] >= 'a' && a[i] <= 'z') || (a[i] >= 'A' && a[i] <= 'Z')) { 
- count++; 
- temp[k] = a[i]; 
- k++; 
- } else if (k != 0) { 
- temp[k] = '\0'; 
- k = 0; 
- p[j] = malloc(sizeof(char) * count + 1); 
- strcpy(p[j], temp); 
- printf("%s ", p[j]); 
- free(p[j]); 
- p[j] = NULL; 
- j++; 
- count = 0; 
- } 
- if (a[i + 1] == '\0' && a[i] != ' ') { 
- temp[k] = '\0'; 
- k = 0; 
- p[j] = malloc(sizeof(char) * count + 1); 
- strcpy(p[j], temp); 
- printf("%s ", p[j]); 
- free(p[j]); 
- p[j] = NULL; 
- } 
- i++; 
- } 
over
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
标题名称:动态分配内存输出文本中的单词的四种做法-创新互联
文章地址:http://www.scyingshan.cn/article/iiheo.html

 建站
建站
 咨询
咨询 售后
售后
 建站咨询
建站咨询 
 