[英]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
,因此它沒有空間存儲整個字符串。
如果要復制字符串,則需要為其所有字符分配足夠的內存:
您可以使用strdup
(在 POSIX 中,但不是標准 C):
char *buf = strdup(str); if (!buf) { ... handle error ... } ... free(buf);
您可以手動復制strdup
:
char *buf = malloc(strlen(str) + 1); if (!buf) { ... handle error ... } strcpy(buf, str); ... free(buf);
您可以使用可變長度數組(但您受到堆棧大小的限制,並且無法檢查錯誤):
char buf[strlen(str) + 1]; strcpy(buf, str); ...
buf
是單個char
而不是pointer
char
的pointer
。 實際上,如果您打算執行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.