簡體   English   中英

如何修復使用strtok后打印的亂碼

[英]How to fix gibberish printed after use strtok

我有 uni 項目,我需要檢查語法是否正確。 我得到一個字符串的指針,並檢查第一個標記是否可以接受。 如果沒問題,我繼續前進。 但萬一它不行,我需要打印出什么問題。

我所做的是創建一個緩沖區,因為我無法更改原始字符串。 之后我使用strtok來切割緩沖區,並查看我得到的令牌是否可以接受。

char *str = "sz = 12345";
printf("The check of MACRO: %d\n", isMacro(str));

int isMacro(char *str)
{
    char buf = NULL;
    char *token;
    strcpy(&buf,str);
    token = strtok(&buf," ");
    printf("You here, value token is %s\n",token);
}

我預計printf會打印 'sz' 但它打印:

You here, value str is sz<▒R
    char buf = NULL;

這是一個類型錯誤。 buf是單個字符,而NULL是一個指針值。 您不能在char存儲指針。

    strcpy(&buf,str);

此代碼具有未定義的行為(除非str恰好是一個空字符串)。 buf不是緩沖區,它是單個char ,因此它沒有空間存儲整個字符串。

如果要復制字符串,則需要為其所有字符分配足夠的內存:

  1. 您可以使用strdup (在 POSIX 中,但不是標准 C):

     char *buf = strdup(str); if (!buf) { ... handle error ... } ... free(buf);
  2. 您可以手動復制strdup

     char *buf = malloc(strlen(str) + 1); if (!buf) { ... handle error ... } strcpy(buf, str); ... free(buf);
  3. 您可以使用可變長度數組(但您受到堆棧大小的限制,並且無法檢查錯誤):

     char buf[strlen(str) + 1]; strcpy(buf, str); ...

buf是單個char而不是pointer charpointer 實際上,如果您打算執行strcpy將字符串復制到其中,則需要先使用 malloc 分配內存。 相反,我建議您使用strdup之類的函數而不是strcpy來創建原始字符串的副本,以使用 strtok 對其進行修改。 請記住稍后free strdup ed 字符串。

像這樣的東西。

int isMacro(char *str)
{
    char *buf = NULL;
    char *token;
    buf = strdup(str);
    token = strtok(buf," ");
    printf("You here, value of token is %s\n",token);
    free(buf);
}

暫無
暫無

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

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