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