
为什么这个C语言程序无法正常运行呢?
#include<stdio.h>#include<ctype.h>#include<stdlib.h>#include<string.h>#defineBUFFER10...
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#define BUFFER 100
int str(char a[]);
char *stro(char a[],char *p[]);
int abcd(char a[]);
int main(void)
{
char aaa[BUFFER];
int i =0;
char *ps = aaa;
char *pt[BUFFER] = { NULL };
char *pp[BUFFER] = { NULL };
char *po = NULL;
char l = 0;
int c = 0;
int b =0;
int t = 0;
fgets(aaa,BUFFER,stdin);
i = str(ps);
for(l = 0;l<i;l++)
pt[l] = stro(aaa,pp);
printf("\n%d",i);
for(l = 0;l<i;l++)
printf("\n%s",pt[l]);
c = abcd(aaa);
printf("\n%d", c);
while(!b)
{
b = 1;
for(t = 0; t < i-1 ; t++)
if(strlen(pt[t]) > strlen(pt[t+1]))
{
b = 0;
po = pt[t];
pt[t] = pt[t+1];
pt[t+1] = po;
}
}
for(t = 0 ;t < i ; t++)
printf("\n%s",pt[t]);
return 0;
}
int str(char* ps)
{
char d = '\0';
int i = 0;
int l = 0;
while(ps[i++] != d)
{
if(isalpha(ps[i]))
{
l++;
while(isalpha(ps[i]))
i++;
while(isspace(ps[i]))
i++;
}
}
return l;
}
char *stro(char a[] ,char *p[])
{
int l = 0;
int c = 0;
int o = 0;
int u = 0;
int i = 0;
int n = 0;
char b[BUFFER];
size_t size = 0;
while(a[i] != '\0')
{
l = 0;
while(isalpha(a[i]))
{
b[l++] = a[i++];
}
while(isspace(a[i++]));
b[l] = '\0';
n = 1;
while(p[u]!=NULL)
if((strcmp(b,p[u++]))==0)
n = 0;
if(n == 0)
continue;
size = strlen(b);
p[o] = (char *)calloc(size+1,sizeof(char));
strcpy(p[o],b);
return p[o];
}
}
int abcd(char a[])
{
int i = 0;
int l = 0;
while(a[i]!='\0')
{
while(isalpha(a[i]))
{
i++;
l++;
}
while((a[i] == ' ') || (a[i] == '\n'))
i++;
}
return l;
}
问题在于第二个函数。。。在于他的哨兵机制。。。
n = 1;
while(p[u]!=NULL)
if((strcmp(b,p[u++]))==0)
n = 0;
if(n == 0)
continue;
程序第一个函数计算有多少个单词。。。第二个函数把数组中的单词返回给pt【l】。第三个函数计算有多少个字母。。。
菜鸟勿扰。。。。 展开
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#define BUFFER 100
int str(char a[]);
char *stro(char a[],char *p[]);
int abcd(char a[]);
int main(void)
{
char aaa[BUFFER];
int i =0;
char *ps = aaa;
char *pt[BUFFER] = { NULL };
char *pp[BUFFER] = { NULL };
char *po = NULL;
char l = 0;
int c = 0;
int b =0;
int t = 0;
fgets(aaa,BUFFER,stdin);
i = str(ps);
for(l = 0;l<i;l++)
pt[l] = stro(aaa,pp);
printf("\n%d",i);
for(l = 0;l<i;l++)
printf("\n%s",pt[l]);
c = abcd(aaa);
printf("\n%d", c);
while(!b)
{
b = 1;
for(t = 0; t < i-1 ; t++)
if(strlen(pt[t]) > strlen(pt[t+1]))
{
b = 0;
po = pt[t];
pt[t] = pt[t+1];
pt[t+1] = po;
}
}
for(t = 0 ;t < i ; t++)
printf("\n%s",pt[t]);
return 0;
}
int str(char* ps)
{
char d = '\0';
int i = 0;
int l = 0;
while(ps[i++] != d)
{
if(isalpha(ps[i]))
{
l++;
while(isalpha(ps[i]))
i++;
while(isspace(ps[i]))
i++;
}
}
return l;
}
char *stro(char a[] ,char *p[])
{
int l = 0;
int c = 0;
int o = 0;
int u = 0;
int i = 0;
int n = 0;
char b[BUFFER];
size_t size = 0;
while(a[i] != '\0')
{
l = 0;
while(isalpha(a[i]))
{
b[l++] = a[i++];
}
while(isspace(a[i++]));
b[l] = '\0';
n = 1;
while(p[u]!=NULL)
if((strcmp(b,p[u++]))==0)
n = 0;
if(n == 0)
continue;
size = strlen(b);
p[o] = (char *)calloc(size+1,sizeof(char));
strcpy(p[o],b);
return p[o];
}
}
int abcd(char a[])
{
int i = 0;
int l = 0;
while(a[i]!='\0')
{
while(isalpha(a[i]))
{
i++;
l++;
}
while((a[i] == ' ') || (a[i] == '\n'))
i++;
}
return l;
}
问题在于第二个函数。。。在于他的哨兵机制。。。
n = 1;
while(p[u]!=NULL)
if((strcmp(b,p[u++]))==0)
n = 0;
if(n == 0)
continue;
程序第一个函数计算有多少个单词。。。第二个函数把数组中的单词返回给pt【l】。第三个函数计算有多少个字母。。。
菜鸟勿扰。。。。 展开
展开全部
里面多次出现while(a[i++])这样的语句,边界值不容易操控的。
while(a[i]) i++; 会好很多。并且在效率上没有差别。
首先假设你的函数1不出问题,则这样改函数2:
char *stro(char a[] ,char *p[])
{
int l = 0;
int c = 0;
static int o = -1;
int u = 0;
int i = 0;
int n = 0;
char b[BUFFER];
size_t size = 0;
while(a[i] != '\0')
{
l = 0;
while(isalpha(a[i]))
{
b[l++] = a[i++];
}
while(isspace(a[i])) i++;
b[l] = '\0';
n = 1;
u = 0;
while(p[u]!=NULL)
{
if((strcmp(b,p[u++]))==0)
n = 0;
}
if(n == 0)
continue;
size = strlen(b);
p[++o] = (char *)calloc(size+1,sizeof(char));
strcpy(p[o],b);
return p[o];
}
}
既然你也不是C新手了,就不用我加注释了吧~
while(a[i]) i++; 会好很多。并且在效率上没有差别。
首先假设你的函数1不出问题,则这样改函数2:
char *stro(char a[] ,char *p[])
{
int l = 0;
int c = 0;
static int o = -1;
int u = 0;
int i = 0;
int n = 0;
char b[BUFFER];
size_t size = 0;
while(a[i] != '\0')
{
l = 0;
while(isalpha(a[i]))
{
b[l++] = a[i++];
}
while(isspace(a[i])) i++;
b[l] = '\0';
n = 1;
u = 0;
while(p[u]!=NULL)
{
if((strcmp(b,p[u++]))==0)
n = 0;
}
if(n == 0)
continue;
size = strlen(b);
p[++o] = (char *)calloc(size+1,sizeof(char));
strcpy(p[o],b);
return p[o];
}
}
既然你也不是C新手了,就不用我加注释了吧~
更多追问追答
追问
如果在不涉及全局变量和静态变量的情况下怎么改呢?。。这个也是我很想知道的。。。谢谢了。。如果是修改静态变量的话。。我把i该成静态变量就好了。。。但我想试试没有静态变量的情况下怎么改。。。而且我也很想知道我的那个函数为什么会重复输出呢?重点就是为什么我的那个函数会重复输出?是因为我没有free(p[o])吗?
追答
传入o参数就行了,让o的控制交给主调函数,这样不需要子函数维护o,即不需要静态。
重复是因为,p[o]每次的值是一样的,都指向p[0],然后p[0]总被修改。p[0]总是可以相同,然后下一个(不论有几个单词,都是第1个的下一个,即为第二个)被ret。
这样每次运行,从第二个开始重复。
free(p[o])和free(p[o - 1])...free(p[o - n])什么的,在主函数里调用就好。能用stack就用stack,heap又慢又难想...找错的时候也纠结
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询