char *str;
printf("Enter string:\n");
scanf("%s",str);
OUTPUT: 運行時檢查失敗#如果你沒有初始化it.You有一個未初始化的指針,其讀取數據到內存中的位置被不被初始化scanf()無法正常工作?
char *str;
printf("Enter string:\n");
scanf("%s",str);
OUTPUT: 運行時檢查失敗#如果你沒有初始化it.You有一個未初始化的指針,其讀取數據到內存中的位置被不被初始化scanf()無法正常工作?
它的一個未定義的行爲用3 海峽這可能最終給你帶來麻煩。您已將str
聲明爲指針,但您尚未給它一個指向的有效位置;它最初包含一些隨機值,可能是也可能不是可寫內存地址。嘗試將內存分配給char * str;
char *str = malloc(sizeof(char)*100);
內存分配只是爲了讓用戶輸入: - /,R.I.P C語言 –
BOX中沒有足夠的空間。你怎麼能夠把一些額外的東西在那裏。分配內存不過是創造一些空間 – Gangadhar
爲什麼在地球上你會'malloc'而不是聲明一個數組?這是否具體,所以你可以忘記以後「免費」?請不要這樣做! –
char *str
聲明str
作爲指針以char
類型。 scanf("%s",str)
將從輸入的字符串中只讀取E
。
由於緩衝區溢出(即可能接受比緩衝區可容納的更多字符),因此您可能並不想完全使用scanf("%s")
(或習慣於使用它)。有關此討論,參見Disadvantages of scanf
分配數組讀成:
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()
,如果僅僅是因爲它作出明智的錯誤報告一個很多更容易。
[+1]最佳答案,甚至info ... – Gangadhar
您必須在爲指針指定某個值之前分配內存。一定要記住指針指向一個內存位置,你必須告訴他你想爲他指定什麼內存位置。因此,您必須這樣做:
str = (char*)malloc(sizeof(char));
這將爲您分配1字節的內存塊。所以,你只能在這個內存塊中分配一個字符。對於字符串,您必須根據字符串中的字符數來分配儘可能多的塊。「Stack」需要5個字符和1個額外的塊用於'\ 0'。所以,你必須爲他分配至少6個內存塊。
str = (char*)malloc(6*sizeof(char));
我希望這將幫助你在C.種植更多的概念
你不應該描述如何使用'malloc'而不描述如何使用'free',並解釋爲什麼一個人必須總是伴隨着另一個。如果你沒有閱讀你的答案,初學者將會去創建他們自己的內存泄漏。真的,在這種情況下,使用數組是一個更好的解決方案。 –
您正在嘗試將數據讀入內存位置未初始化的指針指向? – AnT
奇怪的是,每個人都認爲'需要一個字符串;使用'malloc()''而不是'需要一個字符串;聲明一個數組'。該陣列更易於管理;沒有人提醒你需要'釋放(')''通過'malloc()'分配的內容,也不需要檢查'malloc()'的返回值。 –