比方說,我有一個「game.abc」作爲一個字符串(字符數組),我想要得到點之前的字符。你認爲什麼是C中最有效的方法?解析字符數組
是一個「while直到。複製char到char」的路要走還是有其他方法?
我希望這個問題也能幫助別人。
謝謝!
比方說,我有一個「game.abc」作爲一個字符串(字符數組),我想要得到點之前的字符。你認爲什麼是C中最有效的方法?解析字符數組
是一個「while直到。複製char到char」的路要走還是有其他方法?
我希望這個問題也能幫助別人。
謝謝!
您還可以使用strchr()
後跟strncpy()
查找'。'的第一個實例。然後將所有字符複製到另一個字符串中
這取決於您要優化的內容。如果爲了便於理解/保持可讀性,那麼binW的建議是正確的。
如果您正在追逐週期並且只想訪問一次輸入的每個字符,那麼最好兩個操作(搜索點和複製)並行執行,就像您建議的那樣,通過同時執行它們循環。
請注意,雖然後者聞了很多過早的優化。
根據您正在嘗試實現的內容,自己解析字符串字符可能是處理速度方面最高效的。否則標準字符串庫函數可能是其他答案中建議的方式。
從緩衝區最有效的複製到緩衝區是:
char *in_ptr = in_string;
char *out_ptr = out_buffer;
while(*in_ptr != '.')
{
*out_ptr = *in_ptr;
in_ptr++;
out_ptr++;
}
*out_ptr = '\0';
但是這個風險緩衝區溢出。
最有效的副本分配的內存很可能是:
char *in_ptr = in_string;
while(*in_ptr != '.') in_ptr++;
out_string = (char *)malloc(in_ptr - in_string + 1);
memcpy(out_string, in_string, (in_ptr - in_string));
out_string[in_ptr - in_string] = '\0';
我希望我的數學是正確的存在。它應該是。根據編譯器的不同,您可以通過將(in_ptr - in_string)分配給另一個變量來獲得輕微的優化,因此只能計算一次。第二種解決方案几乎與調用strchr()和memcpy()相同。我建議使用memcpy,因爲它無需替換'。'。使用空終止符,之後將其替換,並將空終止符從一個字符串複製到另一個字符串。
作爲unwind的答案(當我寫這篇文章的時候已經到了)所有這些都可能是不必要的優化。但很高興知道。
您可以使用strtok()來標記字符串。
#include <stdio.h>
main()
{
char str[]="games.abc";
char *tmp,*tmp1;
tmp = strtok(str,".");
printf("tmp %s\n",tmp);
tmp1 = strtok(NULL,"\0");
printf("tmp1 %s\n",tmp1);
}
輸出
./tmp1
tmp games
tmp1 abc