表達式*line++ = '\0';
是直截了當的。正如有些人已經注意到的那樣,++
運算符的優先級高於*
運算符,因此可以將表達式加括號爲*(line++) = '\0';
。
line++
運算符將求值爲當前值line
,然後按行增加該值。因此*line++
評估爲line
當前指向的字符。分配意味着將空字節'\0'
分配給當前位置,並且line
增加超過此位置。這是一個速記:
*line = '\0';
line++;
在的問題,你問:
是什麼*line++ = '\0';
意思?是否等於line[i] = '\0'
和i++;
?
第一部分已經解決。第二部分或多或少是準確的;嚴格地說,它僅適用於首先分配i = 0;
(因此在增量後i
將爲1
),或者如果您始終使用i
來索引line
而不更改line
本身的值。該行*argv = '\0';
線會因爲*argv
更傳統的書面*argv = NULL;
或*argv = 0;
注意是char *
,而不是一個字符。這不正式不正確; '\0'
是一個整數常量零,因此是一個有效的空指針常量,但按照這種方式編寫它是常規的。
在給定的代碼:
void parse(char *line, char **argv)
{
while (*line != '\0') {
while (*line == ' ' || *line == '\t' || *line == '\n')
*line++ = '\0';
沒有必要扎普領先的空白;編寫line++
就足夠了。建議使用isspace()
或isblank()
也很誘人。我觀察到gets()
(顯示在main()
程序中並且不應該使用)的輸入從不包含換行符,所以在這種情況下換行符測試是多餘的。
*argv++ = line;
while (*line != '\0' && *line != ' ' && *line != '\t' && *line != '\n')
line++;
}
*argv = '\0';
}
的想法是,如果輸入行是:
arguments about the meaning of life
那麼以後,你可以讓所有的以下斷言的安全:
assert(strcmp(argv[0], "arguments") == 0);
assert(strcmp(argv[1], "about") == 0);
assert(strcmp(argv[2], "the") == 0);
assert(strcmp(argv[3], "meaning") == 0);
assert(strcmp(argv[4], "of") == 0);
assert(strcmp(argv[5], "life") == 0);
assert(argv[6] == 0);
鑑於你在切入輸入線,考慮POSIX strtok_r()
函數或微軟的strtok_s()
(或者,如果最糟糕的是最壞的,strtok()
,但使用strtok()
需要非常小心 - 例如,調用此函數的代碼在進行呼叫時不能使用strtok()
)。
void parse(char *line, char **argv)
{
char *token = line;
char *extra;
while ((token = strtok_r(token, " \t\n", &extra)) != 0)
{
*argv++ = token;
token = 0;
}
*argv = 0;
}
這也可能是明智的重新設計功能報告許多(非空)的論點有多麼有:
int parse(char *line, char **p_argv)
{
char *token = line;
char *extra;
char **argv = p_argv;
while ((token = strtok_r(token, " \t\n", &extra)) != 0)
{
*argv++ = token;
token = 0;
}
*argv = 0;
return argv - p_argv;
}
注意,使用'得到()'的計劃是危險的;你無法控制緩衝區溢出。第一種互聯網蠕蟲('莫里斯'蠕蟲)利用「獲取()」作爲其傳播方式之一。 C11標準下降'gets()';它不再是標準C的一部分。你應該假設它不存在,或者它包含'abort()',並且永遠不應該使用'gets()'。使用['fgets()'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/fgets.html)或 ['getline()'](http://pubs.opengroup.org/onlinepubs /9699919799/functions/getline.html)。 – 2014-11-22 23:35:53