2017-05-29 50 views
1

我遇到了scanf()函數取0作爲輸入的問題,而不是通過鍵盤的實際輸入。 手頭的任務非常簡單。我需要使用upis函數將元素添加到鏈接列表中,然後打印所有元素並清除列表。但是,我一直打印出0。Scanf()取代0而不是Float鍵盤輸入

起初,我以爲有一些問題,我UPIS功能或用代碼,我打印並清除列表塊,但經過一些修修補補,加入的printf(「BROJJJJJJJJJJJ:」 broj);(打印剛剛輸入的數字),我意識到我一直在那裏得到0,所以在上面的行中必須有scanf()發生。我試圖在f之前添加空格,但根本沒有幫助(scanf(「%f」,& broj);)。

由於部分代碼是不是英語,這裏只是一個快速參考指南:

CVOR =節點

諾維=新

glava =根

sljed =下一個

rep = end

broj = num BER

#include <stdio.h> 
#include <malloc.h> 

typedef struct cvor { 
    float element; 
    struct cvor *sljed; 
} cvor; 

int upis(cvor **glava, cvor **rep, float *broj) { 
    cvor *novi; 
    novi=(cvor*)malloc(sizeof(cvor)); 
    if (novi == NULL) return 0; 
    novi->element = *broj; 
    novi->sljed = NULL; 
    if (*glava == NULL) { 
     *glava = novi; 
     *rep = novi; 
    } 
    else { 
     (*rep)->sljed = novi; 
     *rep = novi; 
    } 
    printf("%d ", (*glava)->element); 
    return 1; 
} 

int main(void) { 
    cvor *glava=NULL, *rep=NULL, *p=NULL; 
    float broj; 
    int n,i; 

    do { 
     printf("Unesite n<=10\n"); 
     scanf("%d", &n); 
    } while (n<=0 || n>10); 

    /* upisivanje */ 
    for (i=0; i<n; i++) { 
     printf("Unesite %d. clan liste\n", i+1); 
     **scanf("%f", &broj);** 
     **printf("BROJJJJJJJJJJJ:",broj);** 
     if (!(upis(&glava, &rep, &broj))) printf ("\nUpis neuspjesan\n"); 
     else printf ("\nUpis uspjesan\n"); 
    } 

    /*ispisivanje i brisanje (od pocetka)*/ 
    for (;glava;) { 
     printf("%d ", glava->element); 
     p = glava; 
     glava = glava->sljed; 
     free(p); 
    } 

    return 0; 
} 

回答

0

你的列表的代碼是正確的,你打印的元素與%d格式,而他們的花車,所以更改此:

printf("%d ", (*glava)->element); 

這樣:

printf("%f ", (*glava)->element); 

並應該看到正確的結果。例如。

./a.out 
Unesite n<=10 
4 
Unesite 1. clan liste 
3.14 
3.140000 
Upis uspjesan 
Unesite 2. clan liste 
2.78 
3.140000 
Upis uspjesan 
Unesite 3. clan liste 
1.11 
3.140000 
Upis uspjesan 
Unesite 4. clan liste 
2.22 
3.140000 
Upis uspjesan 
3.140000 2.780000 1.110000 2.220000 

更多的分析回答:

編譯啓用了一些警告,你應該得到:

Georgioss-MacBook-Pro:~ gsamaras$ gcc -Wall main.c 
main.c:23:20: warning: format specifies type 'int' but the argument has type 
     'float' [-Wformat] 
    printf("%d ", (*glava)->element); 
      ~~  ^~~~~~~~~~~~~~~~~ 
      %f 
main.c:41:34: warning: data argument not used by format string 
     [-Wformat-extra-args] 
     printf("BROJJJJJJJJJJJ:",broj); 
       ~~~~~~~~~~~~~~~~~^
main.c:48:24: warning: format specifies type 'int' but the argument has type 
     'float' [-Wformat] 
     printf("%d ", glava->element); 
       ~~  ^~~~~~~~~~~~~~ 
       %f 
3 warnings generated. 

試試這個,而不是你的調試嘗試:

printf("BROJJJJJJJJJJJ: %f\n",broj); 

當然,我強烈建議您照顧另外兩張照片,除非您想要不準確的照片。


沒有malloc.h,爲了使用malloc(免費),這樣做:

#include <stdlib.h> 

不是什麼導致你的錯誤,但Do I cast the result of malloc?


我嘗試添加之前空格...

這與文字打交道時非常有用。我在Caution when reading char with scanf (C)進一步討論這一點。

+0

感謝您的幫助,我搞砸了版畫。我用的是GCC(C:\ ASP>的gcc -ansi -pedantic -Wall,錯誤-o zad1.exe zad1.c),但它未返回任何警告。一切都很乾淨 – scriptybusiness

+0

我只用'-Wall'標誌@scriptybusiness,你可以在我的答案見。你很近,很好! =) – gsamaras

2

三個問題:

  1. 沒有從scanf測試返回值是總是錯誤
  2. 你不掃描輸入新行或空格,所以進一步scanf函數調用可能返回0(你沒有測試;空間不能是浮動的一部分),並留下相關的參數不變。一個浮在使用前是這樣的,其跳過任何數量的空格字符:

    if (scanf (" %f", &broj) == 1) { /* got something */ } else { /* EOF or error */ }

  3. 格式不匹配的詮釋與浮動。

+0

給予好評用於建議檢查的scanf的'返回值()',這可能會導致麻煩有時。 – gsamaras

+1

感謝您的回答,但在這種情況下,我搞砸了printf()的函數。 – scriptybusiness