使用scanf读取由分隔的字符串和int/

使用scanf读取由分隔的字符串和int/,c,scanf,C,Scanf,输入由一个字符串和一个整数组成,由一个'/'分隔,如下所示: hello/17 char str[20]; int num; scanf("%s/%d", str, &num); // this how I tried to do it. 我想把输入读入一个字符串和一个int,如下所示: hello/17 char str[20]; int num; scanf("%s/%d", str, &num); // this how I tried to do it. 我似

输入由一个字符串和一个整数组成,由一个
'/'
分隔,如下所示:

hello/17
char str[20];
int num;
scanf("%s/%d", str, &num);  // this how I tried to do it.
我想把输入读入一个字符串和一个
int
,如下所示:

hello/17
char str[20];
int num;
scanf("%s/%d", str, &num);  // this how I tried to do it.

我似乎做不到,有什么建议吗?

scanf
在尝试读取
%s
时等待以空格结尾的字符串

尝试直接指定禁止的字符集:

  scanf("%19[^/]/%d", str, &num);

您可以阅读有关格式化代码的更多信息

您只需运行以下程序:

#include <stdio.h>

int main (void) {
    char str[20] = {'\0'};
    int count, num = 42;

    count = sscanf ("hello/17", "%s/%d", str, &num);

    printf ("String was '%s'\n", str);
    printf ("Number was %d\n", num);
    printf ("Count  was %d\n", count);

    return 0;
}
原因与
%s
格式说明符有关。从C99
7.19.6.2开始,fscanf函数
(在C11中基本不变,斜体是我的):

s
:匹配一系列非空白字符

由于
/
不是空白,因此它会被包括在字符串位中,
17
也是出于同样的原因。
sscanf
返回
1
,这意味着只扫描了一个项目,这也表明了这一点

然后,您要查找的是将
/
以外的任何字符扫描到字符串(包括空白)中的内容。标准的同一部分也有帮助:

[
:匹配一组预期字符(扫描集)中的非空字符序列。转换说明符包括格式字符串中的所有后续字符,直到并包括匹配的右括号(])。括号之间的字符(扫描列表)构成扫描集,除非左括号后面的字符是扬抑符(^),在这种情况下,扫描集包含所有未出现在扬抑符和右括号之间的扫描列表中的字符

换句话说,类似于:

#include <stdio.h>
int main (void) {
    char str[20] = {'\0'};
    int count, num = 42;

    count = sscanf ("hello/17", "%[^/]/%d", str, &num);

    printf ("String was '%s'\n", str);
    printf ("Number was %d\n", num);
    printf ("Count  was %d\n", count);

    return 0;
}

另一条建议:永远不要将
scanf
与无界的
%s
%[
一起使用;您要求的是缓冲区溢出攻击。如果您想要强大的用户输入功能,请参阅

一旦您将其作为字符串输入,您就可以
sscanf
随心所欲地将其输入,而不必担心缓冲区溢出(因为您限制了输入的大小)。

可能是这样的:

char str[20];
int num;

scanf("%19[^/]%*c%d", str, &num);

%*c
读取一个字符并丢弃它

一个有趣的问题。
scanf
可能有一些东西可以模拟匹配,而不仅仅是
%s
。在使用
%s
%[
转换时,不要忘记提供字段宽度!我们不喜欢缓冲区溢出。。。