2013-09-28 67 views
2
char *str; 
    printf("Enter string:\n"); 
    scanf("%s",str); 

OUTPUT: 運行時檢查失敗#如果你沒有初始化it.You有一個未初始化的指針,其讀取數據到內存中的位置被不被初始化scanf()無法正常工作?

+0

您正在嘗試將數據讀入內存位置未初始化的指針指向? – AnT

+3

奇怪的是,每個人都認爲'需要一個字符串;使用'malloc()''而不是'需要一個字符串;聲明一個數組'。該陣列更易於管理;沒有人提醒你需要'釋放(')''通過'malloc()'分配的內容,也不需要檢查'malloc()'的返回值。 –

回答

1

它的一個未定義的行爲用3 海峽這可能最終給你帶來麻煩。您已將str聲明爲指針,但您尚未給它一個指向的有效位置;它最初包含一些隨機值,可能是也可能不是可寫內存地址。嘗試將內存分配給char * str;

char *str = malloc(sizeof(char)*100); 
+0

內存分配只是爲了讓用戶輸入: - /,R.I.P C語言 –

+0

BOX中沒有足夠的空間。你怎麼能夠把一些額外的東西在那裏。分配內存不過是創造一些空間 – Gangadhar

+0

爲什麼在地球上你會'malloc'而不是聲明一個數組?這是否具體,所以你可以忘記以後「免費」?請不要這樣做! –

0

char *str聲明str作爲指針以char類型。 scanf("%s",str)將從輸入的字符串中只讀取E

0

由於緩衝區溢出(即可能接受比緩衝區可容納的更多字符),因此您可能並不想完全使用scanf("%s")(或習慣於使用它)。有關此討論,參見Disadvantages of scanf

3

分配數組讀成:

char str[100]; 

if (scanf("%99s", str) != 1) 
    ...error... 

或者,如果你需要一個指針,則:

char data[100]; 
char *str = data; 

if (scanf("%99s", str) != 1) 
    ...error... 

注意使用的長度來防止緩衝區溢出。請注意,指定爲scanf()等的長度比總長度短(基於古代先例的奇數;大多數代碼包括指定長度中的空字節 - 例如參見fgets())。

請記住,%s將跳過前導空格,然後停在第一個空白字符之後的某個非空白字符之後。特別是,它會將換行符留在輸入流中,爲下一個輸入操作讀取做好準備。如果你想輸入的整條生產線,那麼你或許應該使用fgets()sscanf()而不是原始scanf() - 事實上,很多時候你應該使用fgets()sscanf(),而不是scanf()fscanf(),如果僅僅是因爲它作出明智的錯誤報告一個很多更容易。

+0

[+1]最佳答案,甚至info ... – Gangadhar

0

您必須在爲指針指定某個值之前分配內存。一定要記住指針指向一個內存位置,你必須告訴他你想爲他指定什麼內存位置。因此,您必須這樣做:

str = (char*)malloc(sizeof(char)); 

這將爲您分配1字節的內存塊。所以,你只能在這個內存塊中分配一個字符。對於字符串,您必須根據字符串中的字符數來分配儘可能多的塊。「Stack」需要5個字符和1個額外的塊用於'\ 0'。所以,你必須爲他分配至少6個內存塊。

str = (char*)malloc(6*sizeof(char)); 

我希望這將幫助你在C.種植更多的概念

+0

你不應該描述如何使用'malloc'而不描述如何使用'free',並解釋爲什麼一個人必須總是伴隨着另一個。如果你沒有閱讀你的答案,初學者將會去創建他們自己的內存泄漏。真的,在這種情況下,使用數組是一個更好的解決方案。 –