簡體   English   中英

如何用C語言讀取包含空格的字符串

[英]How To Read String that contains Spaces, in C language

當字符串在單詞之間包含空格時,從C鍵盤讀取字符串的最准確方法是什么? 當我為此目的使用scanf時,它不會讀取帶空格的字符串。第二個選項是使用gets但它應該是有害的(我也想知道為什么?)。另一件事是我不知道想要使用任何文件處理概念,例如fgets。

這是讀取包含不使用getsfgets空格的字符串的2種方法

  1. 您可以使用getline (系統中可能不存在POSIX 2008)來方便地管理具有足夠大小的緩沖區的分配,以捕獲整個行。

     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 } 
  2. 如果您絕對需要scanf ,則在此示例中,它將讀取到行尾,除非該行的分隔符數超過指定的字符數減1。 在后一種情況下,該行將被截斷,您將在下一個scanf調用中獲得剩余的字符。

     char line[1024]; while (scanf("%1023[^\\n]\\n", line) == 1) { // do something with line } 

我還應該指出,例如,當您使用scanf從鍵盤讀取字符串時,實際上是從文件指針stdin讀取文件。 因此,您無法避免“任何文件處理概念”

@ 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;
}

還有第三個選項,您可以通過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
'

作為輸出。 在線嘗試。

如果您堅持在范圍內沒有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的理解是不穩定的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM