簡體   English   中英

使用sscanf從字符串中刪除目標字符

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM