[英]I don't know what's going wrong with this code?
我正在編寫一個簡單的代碼,它接受來自用戶的任何長度的字符串並只顯示它。 但是我的代碼沒有正確執行它,因為它接受字符串但沒有正確打印它。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
main()
{
int i,len;
static int n=5;
char a[20];
char **s;
s=malloc(5*sizeof(char));
char *p;
for(i=0;i<n;i++)
{
scanf("%s",a);
if(*a=='1') /*to exit from loop*/
{
break;
}
len=strlen(a);
p=malloc((len+1)*sizeof(char));
strcpy(p,a);
s[i]=p;
if(i==n-1)
{
s=realloc(s,(5+i*5)*sizeof(char));
n=5+i;
}
}
for(i=0;i<n-1;i++)
{
printf("%s ",s[i]);
}
free(p);
p=NULL;
return 0;
}
問題很多,但乍一看,最突出的是,
s=malloc(5*sizeof(char));
是錯的。 s
是char **
類型,因此您需要在那里分配char *
內存價值。 換句話說,您希望s
指向char *
元素,因此,您需要相應地分配內存。
為避免此類錯誤,永遠不要依賴硬編碼的數據類型,而是使用以下形式
s = malloc( 5 * sizeof *s); // same as s=malloc( 5 * sizeof (*s))
其中,大小 oid 基本上由變量的類型決定。 兩大優勢
malloc()
語句也就是說, scanf("%s",a);
也有潛在危險,並會因輸入時間長於預期而導致緩沖區溢出。 您應該始終限制輸入掃描長度,使用最大字段寬度,例如
scanf("%19s",a); // a is array of dimension 20, one for terminating null
也就是說,為了提供有關邏輯的建議,當您事先不知道或不指定輸入字符串的長度時,您不能使用字符串類型來掃描輸入。 完成這項工作的基本方法是
malloc()
等分配器函數動態分配中等長度的緩沖區。fgetc()
或類似內容。EOF
),則您已讀取完整的輸入。 並且,不要忘記free()
內存。
否則,您可以使用fgets()
讀取內存塊並保持如上所述的重新分配。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.