簡體   English   中英

用C中的空格將用戶輸入的String拆分為單獨的標記

[英]Splitting a user-entered String into separate tokens by white space in C

我正在嘗試逐字打印用戶輸入的字符串,或標記化。 我有:

char input [1000]; 

char* token;
scanf("%s", input);

token = strtok (input," ,.");

while (token != NULL){
    printf("%s\n",token);
    token = strtok(NULL, " ,.");
}

當我在控制台中輸入內容時,說出“ test test a two three ..”,僅輸出第一個單詞。

您僅使用scanf掃描第一個單詞。 scanf需要格式化的字符串輸入,即在您的情況下:

scanf("%s %s %s %s", string1, string2 ...

這對您沒有用。 您應該研究使用fgets

請注意, gets無法限制輸入大小。 如果不僅僅由您自己使用,對您的記憶可能會非常危險。 使用fgets

這是一個實時示例。

您使用strtok走上了正確的路。 盡管可以使用scanf ,但是存在一個明顯的限制,即必須對計划轉換的最大字符串數進行硬編碼 如果您使用類似:

scanf("%s %s %s %s", string1, string2 ...

您轉換為令牌的操作將因以下原因而失敗:

one two three four five

因此,除非在編寫代碼之前確保有一定數量的字符串,否則scanf將不起作用。 相反,與您最初的嘗試一樣,您選擇strtok將提供處理無限數量的單詞的靈活性。

最初讀取輸入的唯一問題是選擇"%s"scanf文件說明符,當遇到第一個空格時轉換停止。 如果僅將轉換說明符更改為"%[^\\n]"您將能夠讀取字符串中的所有單詞,直到'\\n'字符為止。 但是,在這種情況下, fgets可以替代scanf 一個簡單的例子是:

#include <stdio.h>
#include <string.h>

#define MAXC 256

int main (void) {

    char buf[MAXC] = {0};
    char *p = buf;

    printf ("\n enter words: ");
    fgets (buf, MAXC, stdin);

    printf ("\n tokens:\n\n");
    for (p = strtok (buf, " "); p; p = strtok (NULL, " \n"))
        printf ("   %s\n", p);

    putchar ('\n');

    return 0;
}

實施例/輸出

$ ./bin/strtok_fgets

 enter words: a quick brown fox jumps over the lazy dog.

 tokens:

   a
   quick
   brown
   fox
   jumps
   over
   the
   lazy
   dog.

如果要使用scanf ,則可以將上述fgets替換為scanf ("%255[^\\n]", buf); 並完成同樣的事情。

暫無
暫無

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

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