搜索
查看: 2304|回复: 2
打印 上一主题 下一主题

到底哪里错了?

[复制链接]
跳转到指定楼层
楼主
发表于 2013-4-4 23:15:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
5啊哈币
本帖最后由 一辈子的鱼 于 2013-4-4 23:18 编辑

编写一个程序,从键盘输入任意条谚语,并将它们存储到执行期间分配的内存里,然后按字长顺序有短到长输出。
搞了一晚,输出倒是按大小排列的,可是和输入的字符串不一样,百思不得其解,请高手指点迷津。


#include <stdio.h>
#include <stdlib.h>
#define SIZE 100
int main(void)
{
    char *p[SIZE] = {NULL};
    int i = 0;
    int j = 1;
    int k = 0;
    int count = 0;
    p[SIZE] = (char *)malloc(SIZE*sizeof(char));
    printf("lease enter some proverbs:\n");  这里的笑脸是字母p。其他的表情都是左括号(。
    for(i = 0,count = 0;i<100;i++,count++)
    {
        printf("%d>>p+%d) = ",i+1,i);
        gets(p+i);
        //printf("%d\n",strlen(p+i));(这句没啥用。)
        if(strlen(p+i)==0)
           break;
    }
    //printf("%d\n",count);(这句也没用。)
    i = 1;
    for(j = 1;j<SIZE;++j)
    {
                while(k<=count)
        {
                        if(strlen(p+k)==j)
            {        
                printf("%d>>: %s\n",i,p+k);
                ++k;
                ++i;
                break;
            }
            else
                ++k;
        }
        k = 0;
    }
        free(p);
        system("pause");
        return 0;
}

输出如下:


Please enter some proverbs:
1>>p+0) = sghdfrytuyihj
2>>p+1) = uyrhfgvb
3>>p+2) = ryt
4>>p+3) = f
5>>p+4) = uytre
6>>p+5) = et
7>>p+6) = dyui                  
8>>p+7) =

上面是从键盘输入的,下面是运行结果,怎么不一样啊?
1>>: f
2>>: et
3>>: ryt
4>>: dyui
5>>: uytret
6>>: uyrhryt
7>>: sghduyrhryt
请按任意键继续. . .


最佳答案

查看完整内容

因为你没正确分配内存 p = (char *)malloc(SIZE*sizeof(char)); 想想这一句什么意思 给p[100]的指针分配了一个内存空间,而不是给数组的每个指针分配空间…… gets(p+i); if(strlen(p+i)==0) 这两句,p是一个数组名,数组名加上一个偏移量是指向该数组元素的指针,不是数组元素本身 在这里编译器做了一些转换,让程序勉强能够运行,然后就得到了奇怪的结果 后面的几处p+k也是一样的问题 while(k
沙发
发表于 2013-4-4 23:15:04 | 只看该作者
因为你没正确分配内存

p[SIZE] = (char *)malloc(SIZE*sizeof(char));
想想这一句什么意思
给p[100]的指针分配了一个内存空间,而不是给数组的每个指针分配空间……

gets(p+i);
if(strlen(p+i)==0)
这两句,p是一个数组名,数组名加上一个偏移量是指向该数组元素的指针,不是数组元素本身
在这里编译器做了一些转换,让程序勉强能够运行,然后就得到了奇怪的结果
后面的几处p+k也是一样的问题

while(k<=count)
k=count的时候是越界的,最初的数组塞满了才能看出来
只有一个元素的时候count=1,但是指针的位置在p[0]

printf("%d>>: %s\n",i,p+k);
                ++k;
                ++i;
                break;

这一段,p+k已经说过了,i变量是不需要的,因为有最外层的j变量可以标注;另外break也是不要的,不然检测不了两个长度相等的字符串

最后free(p)也不对,p是数组名,不是由malloc分配的,不能free



点评

不懂的太多啦,多谢指点,我会努力去纠正。  发表于 2013-4-5 07:26
板凳
发表于 2013-4-5 01:13:04 | 只看该作者
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define SIZE 100
  5. int main(void)
  6. {
  7.     char *p[SIZE];
  8.     int i = 0;
  9.     int j = 1;
  10.     int k = 0;
  11.     int count = 0;
  12.    
  13.     printf("Please enter some proverbs:\n");  
  14.     for(i = 0; i<SIZE; i++,count++)
  15.     {
  16.         printf("%d>>p+%d) = ",i+1,i);
  17.         p[i] = malloc(SIZE);
  18.         gets(p[i]);
  19.         if(strlen(p[i])==0)
  20.            break;
  21.     }
  22.    
  23.     for(j = 1;j<SIZE;++j)
  24.     {
  25.         while(k<count)
  26.         {
  27.             if(strlen(p[k])==j)                 
  28.                 printf("%d>>: %s\n",j,p[k]);
  29.             ++k;
  30.         }
  31.         k = 0;
  32.     }
  33.     system("pause");
  34.     return 0;
  35. }
复制代码
帮你改了下,最后我没有去释放动态分配的内存,没必要,程序结束后操作系统会回收内存
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表