我想阅读用户使用C程序输入的名称.
为此,我写道:
char name[20];
printf("Enter name: ");
gets(name);
Run Code Online (Sandbox Code Playgroud)
但是使用gets不好,那么更好的方法是什么?
我最近偶然发现了一个奇怪的案例(至少对我而言,因为我之前没有遇到过这种情况).考虑下面的简单代码: -
int x;
scanf("%d",&x);
printf("%d",x);
Run Code Online (Sandbox Code Playgroud)
上面的代码采用正常的整数输入并按预期显示结果.
现在,如果我将上面的代码修改为以下代码: -
int x;
scanf("%d ",&x);//notice the extra space after %d
printf("%d",x);
Run Code Online (Sandbox Code Playgroud)
这会在它给出printf语句的结果之前接受另一个额外的输入.我不明白为什么空格会导致scanf()的行为发生变化..任何人都可以向我解释这个....
手册页指出签名sscanf是
sscanf(const char *restrict s, const char *restrict format, ...);
Run Code Online (Sandbox Code Playgroud)
我在SO上看到了一个答案,其中一个函数sscanf用于检查输入是否为整数.
bool is_int(char const* s) {
int n;
int i;
return sscanf(s, "%d %n", &i, &n) == 1 && !s[n];
}
Run Code Online (Sandbox Code Playgroud)
看着!s[n]它似乎建议我们检查是否sscanf扫描了字符序列,直到终止字符\0.所以我假设n代表索引,s当函数结束时sscanf将在字符串中.
但是这个变量i怎么样?这是什么意思?
编辑:
更明确一点:我看到签名需要sscanf一个类型的指针char *作为第一个参数.格式说明符作为seconf参数,因此它知道如何解析字符序列以及与下一个参数一样多的转换说明符变量.我现在明白这i是为了保存解析的整数.
由于只有一个格式说明符,我试图推断出函数n.
我的假设是n正确的吗?
我有以下内容:
char const* code = "3D";
Run Code Online (Sandbox Code Playgroud)
我需要将这个2位数词法十六进制转换为std :: string,这将是一个长度为1的字符串(不包括空终止符).我也可以使用boost库.我怎样才能做到这一点?
在上面的例子中,如果正确转换,我应该有一个打印"="的std :: string.