當字符串在單詞之間包含空格時,從C中鍵盤讀取字符串的最準確方法是什麼?當我爲此使用scanf時,它不會讀取帶空格的字符串。第二種選擇是使用gets,但它應該是有害的(我也想知道爲什麼?)。另一個是我不想要使用任何文件處理概念,如fgets。如何讀取C語言中包含空格的字符串
回答
@ user3623265,
請找到它使用與fgets讀取從標準輸入字符串的示例程序。
請參閱一些示例C文檔,瞭解fgets如何用於從鍵盤獲取字符串以及stdin的用途。
#include <stdio.h>
#include <string.h>
int main(void)
{
char str[80];
int i;
printf("Enter a string: ");
fgets(str, sizeof(str), stdin);
i = strlen(str) - 1;
if (str[i] == '\n')
str[i] = '\0';
printf("This is your string: %s", str);
return 0;
}
如果我*立即*按提示上的^^D會發生什麼情況? (我在一個類似Linux的系統上,所以「你得到一個包含'^ D'的字符串不是一個有效的答案。) – usr2564301
我給了他一個基本的例子,就如何從鍵盤讀取而不是使用scanf()並獲得功能。基本上有多種方法可以避免顯示EOF(Ctrl + D)。問的問題是關於使用scanf()或獲取或其他函數的有效性。因此,出於這兩個我的意見/我喜歡fgets()。如果我所表達/解釋的是錯誤的,那麼請糾正我,因爲我願意在這裏學習。這就是我加入這個社區的原因。 –
我提到它是因爲它會導致長度爲** 0的輸入字符串,'strlen(str)-1'會嘗試訪問不允許的內存。你應該總是檢查'fgets'的返回結果,它*特別*檢查[沒有輸入字符的輸入結束](https://linux.die.net/man/3/fgets)。 – usr2564301
這2種方式來讀取包含不使用gets
或fgets
您可以使用
getline
(2008 POSIX可能不存在您的系統),可以方便地管理足夠大小的緩衝區分配以捕捉整條線路。char *line = NULL; size_t bufsize = 0; size_t n_read; // number of characters read including delimiter while ((n_read = getline(&line, &bufsize, stdin)) > 1 && line != NULL) { // do something with line }
如果你絕對要
scanf
,在這個例子中讀取到行結束,除非行比指定的字符數減去1的分隔符更多。在後一種情況下,該行會被截斷,您將在下一個scanf
調用中獲得剩餘的字符。char line[1024]; while (scanf("%1023[^\n]\n", line) == 1) { // do something with line }
我還要指出的是,當你從鍵盤scanf
例如讀取字符串時,實際上是從文件中讀取與文件指針stdin
。所以你真的不能避免「任何文件處理概念」
大小格式不包括終止空字節格式中的數字應該是1023. –
感謝您指出這@JonathanLeffler –
如果你堅持沒有FILE *範圍,使用getchar()。
char buff[1024];
int ch;
int i = 0;
while((ch = getchar()) != '\n')
if(i < 1023)
buff[i++] = ch;
buff[i] = 0;
/* now move string into a smaller buffer */
通常情況下,stdout和stdin以及FILE *都可用。你的需求有點奇怪,因爲你顯然不是一個高級C程序員,他有一個不尋常的需要壓制FILE *符號,我懷疑你對C IO的理解是不穩定的。
還有第三個選項,您可以用read()
通話讀取stdin
原始數據:
#include <unistd.h>
int main(void) {
char buf[1024];
ssize_t n_bytes_read;
n_bytes_read = read(STDIN_FILENO, buf, sizeof(buf) - 1);
if (n_bytes_read < 0) {
// error occured
}
buf[n_bytes_read] = '\0'; // terminte string
printf("\'%s\'", buf);
return 0;
}
請不是每個輸入被複制到原料包括buf
尾隨回報。也就是說,如果你輸入Hello World
你會得到
'Hello World
'
作爲輸出。嘗試online。
- 1. 如何解析C++中包含空格的字符串?
- 2. 如何在Objective C中搜索包含空格的字符串?
- 3. 如何在C中讀取帶空格的字符串?
- 4. 如何獲取包含指定數量空格的字符串?
- 5. 閱讀C中的空格字符串
- 6. 包含空格的Java字符串
- 7. 如何解析日期包含語言環境的字符串
- 8. C# - 多語言字符串的「取消」
- 9. 如何驗證在PHP中只包含空格的字符串?
- 10. 檢測字符串只包含空格
- 11. 如何獲取包含來自C中字符串的字的子字符串?
- 12. 如何讀取名稱中包含空格和特殊字符的文件?
- 13. 如何在scanf字符串中包含空格?
- 14. 如何在字符串替換中包含空格?
- 15. 是否有任何語言的名稱可以包含空格字符?
- 16. 檢查是否字符串包含在語言(序言)
- 17. 如何從包含空格的字符串創建NSURL?
- 18. 如何從標準輸入包含空格的字符串?
- 19. 包含特殊字符和空格的字符串的MSAccess更新語句
- 20. 如何讀取由空格分隔的無符號字符c
- 21. StreamReader - 如何讀取包含特定字符串的行?
- 22. 如何使用opencsv讀取包含'\'的字符串?
- 23. 如何輸入包含空格的字符串,而不使用標準C++中的標準字符串類?
- 24. 在C#中包含空字符StringBuilder字符串
- 25. 包含包含空終止符字節的字符串的C++返回長度
- 26. 如何檢查字符串是否包含C#中的字符?
- 27. 如何從包含「,」的字符串獲取字符串值?
- 28. 如何建立一個字符串向量(包含空格)?
- 29. 如何從C++讀取XML包含使用PHP的XML的字符串
- 30. 如果它包含c中的格式,則替換字符串#
字符串如何輸入系統?由用戶?從一個文件?從TTY?在套接字上?這太寬了...... – RedX
用戶通過鍵盤 –
你可能想'fgets'。 –