簡體   English   中英

使用scanf忽略分隔字符

[英]Ignoring separating character using scanf

問題:我試圖使用scanf來讀取一個單獨的字段的句子 ,所以我很自然地使用scanf的自然特征來忽略這個符號,但它也忽略了所有具有|的符號 在里面。

代碼簡化:

int main(){
    char* a=malloc(8);
    char* b=malloc(8);
    scanf("%s | %s",a,b);
    printf("%s %s",a,b);
}

當我嘗試輸入時:

測試|

它按預期工作,但當我有以下情況時:

測試我|

它自然會讀取測試,但忽略了ME |,有什么方法可以解決這個問題嗎?

    scanf("%[^ \t|]%*[ \t|]%[^ \t\n|]", a,b);
    printf("%s %s",a,b);

注解:

%* :忽略此元素。

例如%*s //跳過閱讀本文的文本

%[character set(allow)] :您指定的只讀字符集。

例如%[0123456789]%[0-9] //僅作為字符串讀取數字字符

%[^character set(denied)] :表示字符集開頭指定^時的字符。

是的,您可以掃描字符集。 你看到的問題與垂直條無關,它是一個字符串停在第一個空白字符的事實,即"TEST""ME|"之間的空格。

所以,做一些像:

if(scanf("%7[^|] | %7[^|]", a, b) == 2)
{
  a[7] = b[7] = '\0';
  printf("got '%s' and '%s'\n", a, b);
}

有關[ conversion specifier]的詳細信息,請參見scanf()的手冊頁

這應該工作。

char a[200], b[200];

scanf ("%[^|]| %[^\n]", a, b);  // Use it exactly
printf ("a = %s\nb = %s\n", a, b);

這種格式的含義。 我將格式字符串分成3個部分並解釋。

“%[^ |]” - 將所有內容掃描到第一個字符串,直到出現條形字符(“|”)。

“|” - 閱讀“|” 並忽略它。 讀取所有空白字符並忽略它們。

“%[\\ n]” - 將行的剩余部分讀入第二個字符串。

測試用例

first string is         this | 2nd is this
a = first string is     this
b = 2nd is this

no space|between bar
a = no space
b = between bar

我要說的是不要亂用scanf() ,而是嘗試使用saner函數 - 那些按照(直觀)期望工作的函數:

char s1[] = "FOO | BAR";
char s2[] = "FOO BAR |";

void print_sep(char *in)
{
    char *endp;
    char *sep = strtok_r(in, "|", &endp);
    printf("%s\n", sep);
    if (sep = strtok_r(NULL, "|", &endp))
        printf("%s\n", sep);
}

print_sep(s1);
print_sep(s2);

通過使用額外的局部變量來存儲前導空格,可以截斷前導空格。

需要在scanf中提及%[]來存儲前導空格

“%[]%[^ \\ n]”,first_string,second_string,提到scanf格式說明符是讀取兩個字符串。

 first_string contains leading spaces from given input string
 second_string contains actual data without leading spaces.

以下是示例代碼

int main()
{

  char lVar[30];
  char lPlaceHolder[30];

  printf("\n Enter any string with leading spaces : ");
  memset(lVar,'\0',30);
  memset(lPlaceHolder,'\0',30);

  scanf("%[ ]%[^\n]",lPlaceHolder,lVar);

  printf("\n lPlaceHolder is :%s:\n",lPlaceHolder);
  printf("\n lVar is :%s:\n",lVar);
  return(0);
}

輸入:

“ 你好,世界”

輸出:

lPlaceHolder是:

lVar是:你好世界:

注意:上傳到stackover flow網站后,lPlaceHolder的空間顯示不正確

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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