2015-12-30 40 views
0

我在與區域規劃問題,並與fgetws功能從標準輸入讀取。段錯誤讀數寬面向流與區域設置

#include <stdio.h> 
#include <locale.h> 
#include <wchar.h> 

static const int N = 2; 

int main(void) { 
    setlocale(LC_ALL, ""); 
    wchar_t data[N]; 
    fgetws(data, N, stdin); 
    printf("%ls\n", data); 
    /* fclose(stdin); */ 
    return 0; 
} 

當輸入足夠長(5個或更多字符)我得到段錯誤,如果我不return之前關閉stdin。這是爲什麼?這個程序有什麼問題?

+0

剛看到這一點。評論已刪除。 –

+0

數據不是空終止的。您將需要null終止它來打印它。 – cup

+1

我爲什麼這樣做?從glibc的手冊:'fgetws(wchar_t的* WS,詮釋計數,FILE * STREAM)'必須提供COUNT價值的WS空間寬字符,但字符的讀取數量最多COUNT - 1.多餘的字符空間使用在字符串末尾保持空寬字符。 – trupanka

回答

1

可疑fgetws(data, 2, stdin)壞了。

fgetws(),使用這樣一個小緩衝區最多應從stdin讀取1 wchar_t並附加一個teromanting (wchar_t) '\0'

像往常一樣,當代碼神祕地出現故障,最好先檢查從函數的返回來查看是否如預期他們。

#include <stdio.h> 
#include <locale.h> 
#include <wchar.h> 

#include <assert.h> 
#include <stdio.h> 
#include <locale.h> 
#include <wchar.h> 

static const int N = 2; 

int main(void) { 
    char *p = setlocale(LC_ALL, ""); 
    assert(p); 

    wchar_t data[N]; 
    wchar_t *s = fgetws(data, N, stdin); 
    assert(s); 

    int i = printf("%ls\n", data); 
    assert(i == 2); 

    i = fclose(stdin); 
    assert(i == 0); 
    return 0; 
} 
+0

謝謝。但我發現這是glibc-2.22的問題。使用glibc-2.21這段代碼編譯並運行正常。 – trupanka