[英]Removing a target character from a string using sscanf
我最近一直在學習不同的轉換說明符,但我正在努力使用一個更復雜的轉換說明符。 有問題的是括號說明符(%[ set ])。
根據我的理解,從我所讀到的,使用%[ set ],其中任何匹配set(掃描集)中的字符序列的字符串被消耗和分配,並且使用%[^ set ]具有相反的效果; 本質上是消費和分配任何不包含掃描集中字符序列的字符串。
這是我的理解,雖然粗略解釋。 我試圖使用sscanf的這個說明符來使用sscanf從字符串中刪除指定的字符:
sscanf(str_1, "%[^#]", str_2);
假設str_1包含“OH#989”。 我的目的是將此字符串存儲在str_2中,但刪除進程中的哈希字符。 但是, sscanf
停止讀取哈希字符,當我打算存儲“OH989”時僅存儲“OH”。
我是以錯誤的方式使用正確的方法,還是我使用了錯誤的方法? 如何使用sscanf
從字符串中正確刪除/提取指定的字符? 我知道這可以通過其他函數和運算符來實現,但理想情況下我希望使用sscanf
。
掃描集匹配一個(一個或多個)字符序列,這些字符與掃描集括號的內容相匹配或不匹配。 當它遇到不在掃描集中的第一個字符時它會停止。 要獲得字符串的兩個部分,您需要使用以下內容:
sscanf(str_1, "%[^#]#%[^#]", str_2, str_3);
我們可以就第二個轉換規范進行協商; 可能是%s
足夠,或者其他一些掃描設置是合適的。 但是這會給你'before #
'和'after #
'字符串,然后可以連接它們以提供所需的結果字符串。
我想,如果你真的想使用sscanf
去除一個目標角色,你可以這樣做:
char str_2[strlen(str_1) + 1];
if (sscanf(str_1, "%[^#]", str_2) == 1) {
size_t len = strlen(str_2);
/* must verify if a '#' was found at all */
if (str_1[len] != '\0') {
strcpy(str_2 + len, str_1 + len + 1);
}
} else {
/* '#' is the first character */
strcpy(str_2, str_1 + 1);
}
正如您所看到的, sscanf
不適合這項工作,因為它有許多怪癖和缺點。 簡單的循環更有效,更不容易出錯。 你也可以解析str_1
與2個獨立的串sscanf(str_1, "%[^#]#%[\\001-\\377]", str_2, str_3);
並處理3個可能的返回值:
char str_2[strlen(str_1) + 1];
char str_3[strlen(str_1) + 1];
switch (sscanf(str_1, "%[^#]#%[\001-\377]", str_2, str_3)) {
case 0: /* empty string or initial '#' */
strcpy(str_2, str_1 + (str_1[0] == '#'));
break;
case 1: /* no '#' or no trailing part */
break;
case 2: /* general case */
strcat(str_2, str_3);
break;
}
/* str_2 hold the result */
使用sscanf從字符串中刪除目標字符
sscanf()
不是這項任務的最佳工具,見下文。
// Not elegant code
// Width limits omitted for brevity.
str_2[0] = '\0';
char *p = str_2;
// Test for the end of the string
while (*str_1) {
int n; // record stopping offset
int cnt = sscanf(str_1, "%[^#]%n", p, &n);
if (cnt == 0) { // first character is a #
str_1++; // advance to next
} else {
str_1 += n; // advance n characters
p += n;
}
}
簡單循環:
從大海撈針中取出針頭並將干草保存在保釋中。
char needle = '#';
assert(needle);
do {
while (*haystack == needle) haystack++;
} while (*bail++ = *haystack++);
使用haystack = bail = str_1
方法,代碼可以使用haystack = bail = str_1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.