我正在编写一个使用字符串的程序,将其转换为单词数组和内容。 最初,我写的就像
main()
{ char a[100];
char *s;
int len;
getchar();
printf("\nEnter string: ");
gets(a);
for(len=0;*(a+len)!='\0';len++);
printf("\nLength is %d\n",len);
s=malloc(sizeof(char)*len);
s=a;
//Rest of the program
}
我将字符串s用于程序的其余部分。它工作正常。程序的其余部分将单词分开并打印出来,我可以看到输出。
然后我认为这是多余的并且写了
main()
{ char *s;
int app_len;
printf("\nEnter length of string(Approximate more than necessary): ");
scanf("%d",&app_len);
getchar();
printf("\nEnter string: ");
s=malloc(sizeof(char)*app_len);
fgets(s,app_len+1,stdin);
//Rest of the program
}
当我运行第二个版本并提供有效输入时,没有输出,命令提示符返回到窗口 - 相当于美元提示符。
我使用malloc的方式有问题;还是fgets? 在使用malloc分配内存空间后,我只允许为它分配一个值,而不是接受输入吗?
编辑:这是我的所有代码。它现在有效:)#include<stdio.h>
#include<stdlib.h>
void copy(char *dest,char *s)
{ int i;
for(i=0;*(s+i)!='\0';i++)
*(dest+i)=*(s+i);
*(dest+i)='\0';
}
int comp(char *s1,char *s2)
{ int i;
for(i=0;!(*(s1+i)=='\0'||*(s2+i)=='\0');i++)
if(*(s1+i)!=*(s2+i))
return -1;
return 0;
}
int length(char *s)
{ int i;
for(i=0;*(s+i)!='\0';i++);
return i;
}
main()
{ char b[20][20],words[20][20],unique[20][20],non[20][20];
int i,j,k,len,no_of_words, c,count[100],w=0,u=0,nu=0;
int mem = 64;
char *s = malloc(mem);
printf("\nEnter string : ");
fgets(s, mem, stdin);
while(s[length(s) - 1] != '\n') //checks if we ran out of space
{ mem *= 2;
s = realloc(s, mem); //double the amount of space
fgets(s + mem / 2 - 1, mem / 2 + 1, stdin);//read the rest (hopefully) of the line into the new space.
}
len=length(s);
*(s+len--)='\0';
printf("%s",s);
for(i=0,j=0,k=0;i<len&&*(s+i)!='\0'&&*(s+i)!='\n';i++)
{ if(*(s+i)==' ')
{ *(*(b+j)+k)='\0';
j++;
k=0;
}
else
{
*(*(b+j)+k)=*(s+i);//jth word, position k
k++;
}
}
*(*(b+j)+k)='\0';
free(s);
no_of_words=j+1;
for(i=0;i<no_of_words;i++)
{ for(j=0,c=0;j<w;j++)
{ if(comp(*(b+i),*(words+j))==0)
c++;
}
if(c==0)
{ copy(*(words+w),*(b+i));
w++;
}
}
for(j=0;j<w;j++)
{ for(i=0,c=0;i<no_of_words;i++)
{ if(comp(*(b+i),*(words+j))==0)
c++;
}
if(c!=0)
{ copy(*(non+nu),*(words+j));
count[nu]=c;
nu++;
}
if(c==1)
{ copy(*(unique+u),*(words+j));
u++;
}
}
for(i=0,c=0;i<nu;i++)
if(count[i]!=1)
c++;
printf("\nTotal no. of words = %d\n",no_of_words);
printf("No. of distinct words = %d\n",w);
printf("No. of distinct unique words = %d\n",u);
printf("No. of distinct non-unique words = %d\n",c);
printf("\nUnique words:\n");
for(i=0;i<u;i++)
{ printf("%s\n",*(unique+i));
}
printf("\nNon-unique words:\n");
for(i=0;i<nu;i++)
if(count[i]!=1)
printf("%s\tFrequency=%d\n",*(non+i),count[i]);
printf("\nList of all words and their frequencies:\n");
for(i=0;i<nu;i++)
printf("%s\tFrequency=%d\n",*(non+i),count[i]);
}
答案 0 :(得分:1)
在第一个版本中,您将丢失刚刚创建的s字段。它只适用于长度<100。
第二种变体对我来说还可以。也许只将app_len + 1放到malloc()和fgets()。
但最好使用动态阅读:
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
int main() {
int mem = 64;
char *str = malloc(mem);
fgets(str, mem, stdin);
while(str[strlen(str) - 1] != '\n') { //checks if we ran out of space
mem *= 2;
str = realloc(str, mem); //double the amount of space
fgets(str + mem / 2 - 1, mem / 2 + 1, stdin); //read the rest (hopefully) of the line into the new space.
}
printf("%s", str);
}