#include <stdio.h>
#include <stdlib.h>
int main () {
int firstDigit;
char *firstNumber = 0;
char operator;
int secondDigit;
char *secondNumber = 0;
printf("digit ");
scanf("%d *[^\n]", &firstDigit);
fgets(firstNumber, firstDigit, stdin);
printf("%s \n", firstNumber);
}
這里的代碼給了我 null 作為 firstNumber 而它顯然應該只是一個字串。
這是運行此代碼的結果:
$ ./result.exe
digit 2
12
(null)
uj5u.com熱心網友回復:
fgets()我曾設想只留下評論,但很明顯你對and的使用有誤解scanf()。繼續我的評論,讓我們看看我們是否可以提供幫助。
首先,指標是一個普通變數,它保存記憶體地址作為它的值。當您宣告一個指標時,它是未初始化的(設定指標NULL或0不提供任何有效地址)。在您嘗試訪問指標持有的記憶體地址之前,該記憶體地址必須是您可以讀取或寫入的有效記憶體地址。
由于您嘗試使用firstNumberwith fgets(),所持有的記憶體地址firstNumber必須是足夠數量的字符的起始地址來保存您正在閱讀的內容。提供它的最簡單方法是簡單地宣告firstNumber為一個足夠大以容納用戶輸入的字符陣列。(并且由于陣列在訪問時轉換為指向第一個元素的指標,因此您只需使用陣列名稱作為指標)
其次,當您充分了解如何作業以理解它呈現給新 C 程式員的陷阱時,您將理解使用讀取用戶輸入然后將輸入轉換為您需要的內容scanf()要好得多,而不是. 每當您進行用戶輸入或嘗試進行數字轉換時,您都無法正確使用任一函式,除非您檢查回傳以確定輸入或轉換是成功還是失敗。fgets()sscanf()scanf()
由于您想讀取一個字符序列,然后將輸入轉換為整數值,只需宣告firstNumber為字符陣列,將用戶輸入讀入陣列,然后嘗試將 的內容轉換為firstNumber整數firstDigit(如果您只想要用戶輸入中的第一個 ASCII 數字,即firstNumber[0]不需要轉換)
另一方面,如果您想將用戶輸入的全部內容轉換為整數,只需sscanf()以與使用相同的方式使用scanf(),除了從緩沖區讀取firstNumber而不是stdin.
現在,了解fgets()讀取'\n'用戶按下Enter它填充的緩沖區生成的內容。雖然沒有必要將其洗掉以轉換為int,但如果您想將緩沖區用作字串并且不希望任何懸空'\n'移交結束,則通常有必要。值得慶幸的是,它很容易做到strcspn()。
將其完全讀取用戶輸入firstNumber并將整數的字串表示形式轉換為int,您可以這樣做:
#include <stdio.h>
#include <string.h> /* for strcspn() */
#define MAXC 1024 /* if you need a constant, #define one (or more) */
int main () {
int firstDigit = 0;
char firstNumber[MAXC];
fputs ("digit: ", stdout); /* no conversion, fputs is fine */
/* use firstNumber as a temporary buffer to hold input, validate
* fgets succeeds, otherwise user canceled with manual EOF
* ctrl d (or ctrl z on windows)
*/
if (!fgets (firstNumber, sizeof firstNumber, stdin)) {
puts ("(user canceled input)");
return 0;
}
/* trim '\n' from end of buffer by overwriting with nul-character
* optional -- used for outputting firstNumber as string.
*/
firstNumber[strcspn (firstNumber, "\n")] = 0;
/* now parse firstDigit from buffer with sscanf() */
if (sscanf (firstNumber, "%d", &firstDigit) != 1) {
fputs ("error: invalid integer.\n", stderr);
return 1;
}
printf ("\nfirstNumber contains string: \"%s\"\n"
"FirstDigit contains integer: %d\n",
firstNumber, firstDigit);
}
理解這不是您的最終目標,這應該提供您向前閱讀用戶輸入和處理所需的任何轉換所需的所有基本構建塊。
示例使用/輸出
$ ./bin/firstnumdigit
digit: 24371
firstNumber contains string: "24371"
FirstDigit contains integer: 24371
或者如果用戶搞砸了會發生什么(他們會)
$ ./bin/firstnumdigit
digit: two hundred twenty one
error: invalid integer.
并處理EOF指示用戶取消輸入的手冊:
$ ./bin/firstnumdigit
digit: (user canceled input)
看看事情,如果你有問題,請告訴我。
uj5u.com熱心網友回復:
fgets沒有改變firstNumber。它不可能改變firstNumber,因為 C 是按值傳遞的。所以firstNumber仍然有你給它的價值,NULL。
fgets應該做的是寫入記憶體到哪些點firstNumber。因此,按照您的方式通過NULL是一個錯誤。您需要將指標傳遞給足夠的記憶體來保存您想要的值。第二個引數是該記憶體的大小。
uj5u.com熱心網友回復:
firstNumber是一個字串,但是當您NULL在其宣告中將其設定為時fgets,無法將任何內容寫入其中。該程式因此遇到了段錯誤。
您應該使用 初始化firstNumber,malloc或將其宣告更改為char firstNumber[64]
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/518357.html
標籤:Cfgets
上一篇:將字符陣列傳遞給函式會回傳警告
下一篇:從C中的無符號字符中檢索多個值
