我創建了一個結構資料型別“ans”,其中包含三個字串資料型別成員變數 a[2]、b[2]、c[2]。在 main 內部,我創建了一個結構變數 'p' 來接受三個字串輸入,然后通過參考呼叫將其傳遞給一個函式 - void f1(ans *x) 以列印字串。現在在函式中,不是列印三個單獨的字串 (*x).a,(*x).b,(*x).c,而是列印連接在一起的整個字串。我附上代碼和輸出以供參考:
#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;
}
樣本輸出:
Enter for a:
ab
Enter for b:
cd
Enter for c:
ef
The strings are :
abcdef
cdef
ef
誰能解釋為什么這顯示為輸出而不是以下內容:
The strings are:
ab
cd
ef
我不知道發生了什么:(
uj5u.com熱心網友回復:
在scanf("%s", p.a);中,scanf讀取字符并將它們寫入 指向的記憶體p.a。它還在它們之后寫入終止空字符。由于a結構的成員被宣告為char a[2];,當scanf寫入兩個以上的字符(包括終止的 null)時,C 標準未定義該行為。
在printf("%s\n",(*x).a);, for 中%s,printf獲取一個指向 a 的指標char并列印它在那里找到的字符,直到終止的空字符標記字串的結尾。當沒有終止空字符時,陣列即(*x).a超出printf陣列,并且 C 標準未定義行為。
要解決此問題,請確保陣列中有足夠的空間用于寫入其中的所有字符,包括終止的空字符,或者確保在陣列中寫入的字符不會超出容量。
uj5u.com熱心網友回復:
如果您輸入"ab",scanf將掃描字串為"ab\0"3 個字符,因此您a[2]不會像其他變數一樣適合。
uj5u.com熱心網友回復:
為了防止 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;
}
樣本輸出:
Enter for a:
abcdefgh
Enter for b:
cdefghij
Enter for c:
efghijkl
The strings are :
ab
cd
ef
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/418851.html
標籤:
上一篇:R從函式中替換串列元素
