[英]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);
,對於%s
, printf
獲取一個指向char
的指針並打印在那里找到的字符,直到終止 null 字符標記字符串的結尾。 當沒有終止 null 字符時,數組即(*x).a
, printf
超出數組,並且行為未由 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.