6

问题:我正在尝试使用 scanf 来读取一个由 | 分隔的字段的句子 ,所以我很自然地使用scanf的自然特征来忽略这个符号,但它也会忽略所有有|的东西 在里面。

代码,简化:

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

当我尝试输入时:

测试 | 我

它按预期工作,但是当我遇到以下情况时:

测试我|

它自然会读取测试,但忽略 ME|,有什么办法解决这个问题吗?

4

5 回答 5

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

注解:

%*: 忽略这个元素。

eg %*s//跳过这一篇的文字的阅读

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

eg %[0123456789]or %[0-9]//Read as a string only numeric characters

%[^character set(denied)]^: 表示在字符集的开头指定了when 以外的字符。

于 2013-06-20T12:59:08.123 回答
1

是的,您可以扫描字符集。您看到的问题与竖线无关,而是字符串在第一个空白字符处停止,即 and 之间的"TEST"空格"ME|"

因此,请执行以下操作:

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

有关转换说明符的详细信息,请参阅手册页。scanf()[

于 2013-06-20T12:54:25.313 回答
1

这个应该可以的。

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
于 2013-06-21T04:31:10.617 回答
0

可以通过使用额外的局部变量来存储前导空格来截断前导空格。

%[ ] 需要在 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 是 :hello world:

注意:上传到 stackover flow 网站后,lPlaceHolder 的空间无法正确显示

于 2017-10-05T08:49:09.323 回答
-1

我会说,不要乱用scanf(),而是尝试使用更理智的功能 - 那些按照(直观)期望工作的功能:

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);
于 2013-06-21T04:39:28.163 回答