2012-05-07 49 views
-1

本質上,我試圖編寫代碼,將變量n的ASCII位模型轉換爲變量x的僅量值位模型。我只是假設用戶輸入的只有三位數字。這是我到目前爲止:從ASCII位模型轉換爲僅量化位模型

#include <stdio.h> 
main() 
{ 
    char n[10]; 
    int x; 
    printf("Enter three digit, nonnegative: "); 
    scanf("%s" ,n); 
    . 
    . 
    . 
    printf("The number is %d\n", x); 
} 

任何幫助,非常感謝。

編輯:只有位模型:最簡單的位模型是爲非負整數。在這種情況下,每個比特代表2的非負整數冪。比特值0表示地點值0;位值爲1表示地點值。所表示的數字的總值通過將所有比特的位置值相加來找到。例如:8位表示的值爲19:0 + 0 + 0 + 16 + 0 + 0 + 2 + 1 = 19。

+3

什麼是「ASCII位模型」和「幅度位模型」?你的意思是「如何從字符串轉換爲整數?」 –

+0

我想你可能會尋找'的scanf( 「%U」,&x);'(其中x是一個unsigned int) – Corbin

+0

...或'的atoi()'。 –

回答

0

雖然BLUEPIXY有一個答案這在技術上不正是你所求的,它非常複雜,可能不是你想要的任何實際的程序是什麼,除非你進入一個模糊Ç競爭。您可能想要更類似的東西:

int main() { 
    int x; 

    printf("Enter three digit, nonnegative: "); 
    while (scanf("%d", &x) != 1 || x < 100 || x > 999) { 
     printf("Not a valid input, try again: "); 
     fflush(stdin); 
    } 
    printf("The number is %d\n", x); 
    return 0; 
} 

現在,這與BLUEPIXY編寫並接受不同輸入的內容不同。特別是,它允許(並忽略)空白,在數字後會忽略額外的殘留,甚至如果前導數字爲0則允許輸入4位數字,所以最終數字最終在100..999。如果你特別想禁止這樣的輸入,你需要更多的東西,比如他寫的東西。

+0

這是雞蛋裏挑骨頭,但'fflush(標準輸入)'不上任何東西,但Windows上工作你需要'int c; do c = getchar(); wh ile(c!= EOF && c!='\ n');'。 – zwol

0
#include <stdio.h> 

int main(void){ 
    char n[10]; 
    int x=0; 
redo: 
    printf("Enter three digit, nonnegative: "); 
    if(4!=scanf("%1[1-9]%1[0-9]%1[0-9]%1[\n]", &n[0],&n[1],&n[2],&n[3])){ 
     fflush(stdin); 
     goto redo; 
    } 
    //printf("%s\n",n); 
    x = 100*(n[0]-'0')+10*(n[1]-'0')+(n[2]-'0'); 
    printf("The number is %d\n", x); 
    return 0; 
} 
+0

行,不過也有更簡潔的方式 –

+0

@OliCharlesworth - ?。?你會如何使它比這更清潔 – Extinct23

0

兩個現有答案使用scanf,這始終是一個錯誤:在這種情況下,這是一個錯誤,因爲scanf展品未定義的行爲如果用戶鍵入了太多的輸入數字。我沒有這樣做。

一種更好的方式在C讀取用戶輸入是使用fgets(或getline如果可用和長行是關注)一次讀取整個行,然後將數字轉換爲二進制與strto*家族的功能,這 - 與scanf不同 - 在輸入溢出時具有良好定義的行爲。它們還使得從其他類型的不合格輸入中檢測和恢復變得非常容易(在這種情況下它不是一個真正的問題,但是如果輸入格式更復雜一些)。

#include <stdio.h> 
#include <stdlib.h> 
int main(void) 
{ 
    char buf[10], *endp; 
    unsigned long n; 
    int c; 
    for (;;) { 
     fputs("Enter three digit, nonnegative: ", stdout); 
     fgets(buf, sizeof buf, stdin); 
     n = strtoul(buf, &endp, 10); 
     if (n <= 999 && *endp == '\n') 
      break; 
     puts("?Redo from start"); 
     do c = getchar(); while (c != '\n' && c != EOF); 
    } 
    printf("The number is %lu\n", n); 
    return 0; 
}