gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:49:55 27 4
gpt4 key购买 nike

我正在编写一个处理字符串的程序,将其转换为单词数组,等等。最初,我是这样写的

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。它运作良好。程序的其余部分将单词分开并打印出来,我可以看到输出。

然后我觉得a是多余的,写了

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
}

当我运行第二个版本并提供有效输入时,没有输出,命令提示符返回到美元提示符的 Windows 等价物。

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

最佳答案

在第一个变体中,您将丢失刚刚创建的 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);
}

关于c - 如何将字符串输入到使用 malloc 分配的 char* 变量中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21560081/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com