2014-09-18 36 views
-3

在這裏你可以看到我的源代碼:很少有新手的問題,與scanf函數和轉換說明問題

#include <stdio.h> 

int main() 
{ 
    char yourname; 
    char yoursex; 
    int yourage = 0; 

    printf("Hey, what's your name?\n"); 
    printf("My name is: "); 
    scanf("%s", &yourname); 
    printf("Oh, hello %s! \n\n", &yourname); 

    printf("Are you a boy or a girl?: "); 
    scanf("%s", &yoursex); 
    printf("Nice to know you are a %s! \n\n", &yoursex); 

    printf("How old are you %s? I am ", &yourname); 
    scanf("%d", &yourage); 
    printf("I see you are %d, you have many years then!", &yourage); 

    return 0; 
} 

我嘗試的事情,我不知道了,奇怪的是它不是爲我工作。有什麼問題?另外,爲什麼它需要%s而不是%c?如果我使用%c,它不起作用!

它說: 你幾歲?而不是把我的名字,它說''OY''

而不是在最後一行顯示我的年齡,它顯示了一個很大的數字。

非常感謝你,編程是複雜的,但是很有成就感:)

+0

'char'表示*一個字符*。您不能在其中存儲名稱。 – 2014-09-18 23:08:21

回答

2

這些都是C語言程序設計非常基本的,我強烈建議你得到一個體面的書 - 由丹尼斯里奇C程序設計語言會一個好的開始。

代碼中有許多錯誤。

  1. 一個char只能包含一個字符,如 'A',或 'A' 或類似的東西。當你掃描一個名字時,它將成爲一組字符,比如'E','d','d','y'。要存儲多個字符,您需要使用字符數組。此外,用於掃描/打印字符的格式說明符是%c,%s適用於需要掃描一組字符時,也稱爲字符串的數組。

  2. 當您使用printf,你不提供一個指向你要打印變量(&x是一個指針變量x)。指針是一個32/64位整數,這很可能就是爲什麼當您嘗試打印時看到一個隨機整數。 printf("%c\n", charVar)就足夠了。同時使用%s作爲格式說明

  3. scanf並不需要一個&,假設你通過一個字符數組作爲參數。原因是,scanf需要知道在哪裏存儲您正在從輸入讀取的數據 - 這是由指向內存位置的指針給出的。當你需要掃描一個整數時,你需要通過一個&x - 這意味着指向x的內存位置。但是,當你傳遞一個字符數組時,它已經是一個內存地址的形式,並且不需要在一個和符之前。

我再一次推薦你在網上查找一些體面的教程,或者得到一本書(我上面提到的是一本經典的書)。輸入材料中給出的示例。實驗。玩的開心。 :)

0

這是一個單字符

char yourname; 

但是%s表示該變量是一個(即,由一個NUL終止字符數組)。這就是爲什麼你需要%c。如果你真的打算用字符串,然後定義像

char yourname[32]; /* just pick a big enough size */ 

同樣的變量,你是正確使用的的變量地址與scanf(),但printf()需要的價值。因此,而不是

printf("I see you are %d, you have many years then!", &yourage); 

使用

printf("I see you are %d, you have many years then!", yourage); 

「大數目」 是內存地址。

1

%s用於讀取字符串 - 多個字符由空格分隔。 %c用於讀取單個字符。

您將yournameyoursex變量聲明爲字符,然後嘗試將字符串讀入它們中。讀取的字符串會覆蓋堆棧幀中隨機的其他內容,並導致錯誤或崩潰。

要聲明yournameyoursex爲字符數組,這樣他們就可以容納字符串:

char yourname[32]; 
char yoursex[32]; 

然後,讀入他們的時候,你要包括長度的限制,使他們不溢出:

scanf("%31s", yourname); 
0

請確保您閱讀了代碼中的註釋!

#include <stdio.h> 

int main() 
{ 
    char yourname[10]; 
    char yoursex[5]; // boy or girl + null terminator 
    int yourage = 0; 

    printf("Hey, what's your name?\n"); 
    printf("My name is: "); 
    scanf("%s", &(*yourname)); // & and * cancel each other out, 
    // thus take a look at the next scanf() 
    printf("Oh, hello %s! \n\n", yourname); // yourname is now an array 

    printf("Are you a boy or a girl?: "); 
    scanf("%s", yoursex); 
    printf("Nice to know you are a %s! \n\n", yoursex); 

    printf("How old are you %s? I am ", yourname); 
    scanf("%d", &yourage); // ok 
    printf("I see you are %d, you have many years then!", yourage); // here you don't 
    // need the address of the variable! 

    return 0; 
} 
0

表達char yourname;僅持有單個字符的空間,所以很有可能你最終會在掃描時提供yourname損壞的內存空間。您應該分配一個更大的緩衝區,並確保您不會超過其長度,方法是設置要用scanf函數讀取的最大字符數;如其他一些答案中所述。

事實上,以下printf打印正確的名稱並不意味着內存不會損壞;因爲C/C++不會真正檢查運行時使用的任何字符串或數組的邊界。

正如其他人所建議的,首先閱讀一本關於C和/或C++的好書並不是一個壞主意。