簡體   English   中英

為什么結構指針變量在它指向的結構變量中打印整個內容,即使我想打印特定元素?

[英]Why is struct pointer variable printing the whole thing inside the struct variable it's pointing to even though I want to print a specific element?

我創建了一個結構數據類型“ans”,其中包含三個字符串數據類型成員變量 a[2]、b[2]、c[2]。 在 main 內部,我創建了一個結構變量 'p' 來接受三個字符串輸入,然后通過引用調用將其傳遞給 function - void f1(ans *x) 以打印字符串。 現在在 function 中,不是打印三個單獨的字符串 (*x).a,(*x).b,(*x).c,而是打印連接在一起的整個字符串。 我附上代碼和 output 以供參考:

#include <stdio.h>

typedef struct 
{
    char a[2];
    char b[2];
    char c[2];
} ans;

void f1(ans *x) {
   printf("The strings are :\n");
   printf("%s\n",(*x).a);
   printf("%s\n",(*x).b);
   printf("%s\n",(*x).c);
}

int main() {
    ans p;
    printf("Enter for a:\n");
    scanf("%s", p.a);
    printf("Enter for b:\n");
    scanf("%s", p.b);
    printf("Enter for c:\n");
    scanf("%s", p.c);

    f1(&p);

    return 0;
}

樣品 output:

Enter for a:
ab
Enter for b:
cd
Enter for c:
ef
The strings are :
abcdef
cdef
ef

誰能解釋為什么這顯示為 output 而不是以下內容:

The strings are:
ab
cd
ef

我不知道發生了什么:(

scanf("%s", pa); , scanf讀取字符並將它們寫入pa指向的 memory 。 它還在它們后面寫入一個終止 null 字符。 由於結構的a成員被聲明為char a[2]; ,當scanf寫入兩個以上字符時,包括終止 null,C 標准未定義該行為。

printf("%s\n",(*x).a); ,對於%sprintf獲取一個指向char的指針並打印在那里找到的字符,直到終止 null 字符標記字符串的結尾。 當沒有終止 null 字符時,數組即(*x).aprintf超出數組,並且行為未由 C 標准定義。

要解決此問題,請確保 arrays 中有足夠的空間用於所有要寫入其中的字符,包括終止 null 字符,或者確保在 ZA3CBC3F9D0CE2F2C1554E1B671D71 中寫入的字符不超過合適的。

如果您輸入"ab"scanf會將字符串掃描為"ab\0" ,即 3 個字符,因此您a[2]不會像其他變量一樣適合。

為了防止 scanf 超出數組,您的程序的簡單改編,可以建議的幾個:

#define MAXCH   3

typedef struct 
{
    char a[MAXCH];
    char b[MAXCH];
    char c[MAXCH];
} ans;

void f1(ans *x)
{
   printf("The strings are :\n");
   printf("%s\n",(*x).a);
   printf("%s\n",(*x).b);
   printf("%s\n",(*x).c);
}

int main()
{
    ans p;
    char in[128];
    
    printf("Enter for a:\n");
    scanf("%s",in);
    snprintf(p.a,MAXCH,"%s",in);
    printf("Enter for b:\n");
    scanf("%s",in);
    snprintf(p.b,MAXCH,"%s",in);
    printf("Enter for c:\n");
    scanf("%s",in);
    snprintf(p.c,MAXCH,"%s",in);

    f1(&p);

    return 0;
}

樣品 output:

Enter for a:
abcdefgh
Enter for b:
cdefghij
Enter for c:
efghijkl
The strings are :
ab
cd
ef

暫無
暫無

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

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