如何将字符串输入到使用malloc分配的char *变量中?

时间:2014-02-04 18:08:05

标签: c

我正在编写一个使用字符串的程序,将其转换为单词数组和内容。 最初,我写的就像

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]); 
}   

1 个答案:

答案 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);
}