使用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
格式说明符有关。从C997.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
或%[
转换时,不要忘记提供字段宽度!我们不喜欢缓冲区溢出。。。