這個問題在這里已經有了答案: 為什么 strtok 會這樣改變它的輸入? (3 個回答) 6 天前關閉。
這部分讓我有點困惑。當我運行程式時,使用“一二三”作為輸入,緩沖區的第一個列印是正常的。一旦我使用 strtok 并嘗試再次列印緩沖區,它只會列印“一”而不是“一二三”。我是否在不知道的情況下更改了緩沖區的內容?如果是,有沒有辦法不發生這種情況?感謝您的時間!
#include "stdlib.h"
#include "string.h"
int main (void )
{
char *buffer;
size_t buffer_size =64;
buffer = (char *) malloc(64 * sizeof (char ));
getline(&buffer,&buffer_size,stdin);
char *anotherbuffer;
printf("%s\n",buffer);
anotherbuffer = (char *) malloc(64 *sizeof (char ));
anotherbuffer = strtok(buffer," ");
anotherbuffer = strtok(NULL," ");
printf("The buffer \"buffer\" containts %s\n",buffer);
printf("The buffer \"anotherbuffer\" containts %s\n",anotherbuffer);
return 0;
}```
uj5u.com熱心網友回復:
如果您查看strtok(例如在 cppreference.com 上)的描述,您會發現它在它檢測到的第一個(或在后續呼叫中,下一個)分隔符處放置了一個 '\0' 位元組。這就是為什么當您在第一次使用 strtok 后列印緩沖區時,該緩沖區中的 C 字串實際上變得更短了。其余字符仍然存在,但就 printf %s (以及其他字串函式,如 strlen 而言)而言,字串現在在第一個分隔符所在的位置終止,因為有一個 '\0' 字符現在。
為避免修改緩沖區,您需要使用不同的函式。例如,您可以使用strpbrk或strcspn分別從一個記憶體地址中查找第一個分隔符的地址,或者到該第一個分隔符的長度。從那里您可以通過使用新地址作為下一次呼叫這些函式的起點來前進。要將標記提取到它自己的 C 字串中,您必須將其從原始緩沖區復制到一個新緩沖區中,并在那里用 \0 終止它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/519692.html
標籤:C细绳指针
下一篇:從函式內部更改全域字串指標變數?
