簡體   English   中英

不知道這段代碼有什么問題?

[英]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));

是錯的。 schar **類型,因此您需要在那里分配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

也就是說,為了提供有關邏輯的建議,當您事先不知道或不指定輸入字符串的長度時,您不能使用字符串類型來掃描輸入。 完成這項工作的基本方法是

  1. 使用malloc()等分配器函數動態分配中等長度的緩沖區。
  2. 繼續一一讀取輸入流, fgetc()或類似內容。
  3. 如果讀取完成(例如,返回EOF ),則您已讀取完整的輸入。
  4. 如果分配的內存已用完,則重新分配原始緩沖區並繼續執行步驟 3。

並且,不要忘記free()內存。

否則,您可以使用fgets()讀取內存塊並保持如上所述的重新分配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM