[英]How do I return a whole line from a .txt by searching for a string contained in that same line?
[英]How do I read a whole line to a string?
int run_add_line_after(Document *doc, char *command) {
int paragraph_num, line_num;
char com[MAX_STR_SIZE + 1], extra[MAX_STR_SIZE + 2], line[MAX_STR_SIZE + 1];
if (sscanf(command, " %s %d %d %s", com, ¶graph_num, &line_num, extra)
== 4 && paragraph_num > 0 && line_num >= 0 && extra[0] == '*') {
strcpy(line, &(extra[1]));
if (add_line_after(doc, paragraph_num, line_num, line) == FAILURE) {
printf("add_line_after failed\n");
}
return SUCCESS;
}
return FAILURE;
}
我希望sscanf
讀取command
中extra
的所有內容,但它只占用第一個單詞。 例如,如果我有:
我想看看:
但相反,我得到:
因為%s
在碰到空格時會停止。 如何閱讀該行的其余部分,同時仍然忽略'0'
和'*'
之間的任何空格?
作為參考, MAX_STR_SIZE
是 80, command
是 1025 個字符數組(盡管我認為這並不重要)。 假設extra
足夠大以容納其余的行。
sscanf
真的是在這里使用的錯誤工具。 它可以完成,但可能不應該以您嘗試的方式使用。 幸運的是,您沒有將com
傳遞給add_line_after
,這意味着沒有必要確保com
是一個正確以 null 結尾的字符串,這使您可以避免所有不必要的字符串復制。 (如果您要傳遞com
,則必須復制它,或者將空終止符寫入command
。)您根本不希望或不需要使用sscanf
來移動數據。 您可以使用它來解析數值。 我不清楚你是否想丟棄*
后面的任何空格,而這段代碼沒有。 如果你想這樣做,刪除那個空格是微不足道的,留給讀者練習:
int
run_add_line_after(struct document *doc, const char *command)
{
int paragraph_num, line_num, n;
const char *line;
if( 2 == sscanf(command, "%*s %d %d %n", ¶graph_num, &line_num, &n)
&& paragraph_num > 0 && line_num >= 0 && command[n] == '*' )
{
line = command + n + 1;
if( add_line_after(doc, paragraph_num, line_num, line) == FAILURE) {
fprintf(stderr, "add_line_after failed\n");
} else {
return SUCCESS;
}
}
return FAILURE;
}
這里的想法是簡單地使用sscanf
來找出extra
數據在字符串中的位置並解析整數值。 這絕對是錯誤的工具( scanf
系列(幾乎)總是錯誤的工具),這里僅用於演示。
- 編輯 -
但是,當然,這並不完全符合您的要求。 將一些功能移動到add_line_after
來處理換行符會更干凈,但是由於您還需要刪除換行符,因此有必要執行以下操作:
int
run_add_line_after(struct document *doc, char *command)
{
int paragraph_num, line_num, n;
char *line;
if( 2 == sscanf(command, "%*s %d %d %n", ¶graph_num, &line_num, &n)
&& paragraph_num > 0 && line_num >= 0 && command[n] == '*' )
{
line = command + n + 1;
line[strcspn(line, "\n")] = '\0';
if( add_line_after(doc, paragraph_num, line_num, line) == FAILURE) {
fprintf(stderr, "add_line_after failed\n");
} else {
return SUCCESS;
}
}
return FAILURE;
}
這並不理想。 如果您修改 API 會更好,這樣您就可以避免復制數據和修改給定的字符串。
知道了。 格式字符串應為" %s %d %d %[^\n]s"
。 它將繼續讀取最后一個字符串變量,直到它按下回車鍵。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.