我在尝试弄清楚如何使用时遇到了很多问题scanf().它似乎与整数一致,相当直接scanf("%d", &i).
我遇到问题的地方是scanf()在循环中尝试读取输入.例如:
do {
printf("counter: %d: ", counter);
scanf("%c %c%d", &command, &prefix, &input);
} while (command != 'q');
Run Code Online (Sandbox Code Playgroud)
当我输入一个有效的结构化输入时c P101,它似乎再次循环,然后提示我.即使只有一个,这似乎也会发生:
scanf("%c", &c)
Run Code Online (Sandbox Code Playgroud)
在一个循环中.在再次提示我之前,它会进行两次循环.是什么让它循环两次,我该如何阻止它?
当我输入较少量的输入时,以编程方式不会有其他字符或数字,例如q,按Enter似乎提示我输入更多.如何scanf()处理单字符和双字符条目?
如果用户输入整数变量的浮点数,我想打印无效输入.那可能吗?
int a;
scanf("%d",&a); // if user enters 4.35 print invalid input
Run Code Online (Sandbox Code Playgroud)
我试过像这样的人物
if(scanf("%d",&a)==1);
else printf("invalid input");
Run Code Online (Sandbox Code Playgroud)
但如何处理浮动数字.如果用户输入4.35它截断到4但我想要无效输入.
在我的实验中这个表达
double d = strtod("3ex", &end);
Run Code Online (Sandbox Code Playgroud)
初始化d,3.0并将end指针放在'e'输入字符串中的字符处.这正如我所期望的那样.该'e'字符可能看起来是指数部分的开头,但由于缺少实际的指数值(6.4.4.2要求),因此'e'应将其视为完全独立的字符.
但是,当我这样做的时候
double d;
char c;
sscanf("3ex", "%lf%c", &d, &c);
Run Code Online (Sandbox Code Playgroud)
我注意到,sscanf消耗都'3'与'e'该%lf格式说明.变量d接收3.0价值.变量以其c结尾'x'.这看起来很奇怪有两个原因.
首先,由于语言规范strtod在描述%f格式说明符的行为时引用,我直观地期望%lf以相同的方式处理输入strtod(即选择与终止点相同的位置).但是,我知道历史scanf上应该只返回一个字符回输入流.这限制了任何前瞻scanf可以通过一个角色执行的距离.上面的例子需要至少两个字符前瞻.所以,让我们说,我接受这样的事实%lf消耗都'3'与'e'从输入流.
但后来我们遇到了第二个问题.现在sscanf必须将其转换"3e"为类型double."3e"不是浮点常量的有效表示(同样,根据6.4.4.2,指数值不是可选的).我希望sscanf看待这个输入为错误:在终止%lf转换,返回0和离开d …
我想知道函数如何发出编译时警告?
我想到了这一点,因为当我们在printf(scanf)的第一个参数中为与该类型说明符匹配的变量提供错误的格式说明符并使用带有-Wall选项的gcc进行编译时,编译器会发出警告.
现在,printf和scanf定期实现可变参数函数,据我所知,我不知道在编译时检查字符串值的任何方法,更不用说在某些内容不匹配时发出警告.
有人能解释我如何获得编译器警告吗?
我想从stdin读取一个int,但我想验证用户是否超过了int max值.我该怎么做?
int n;
scanf("%d", &n);
Run Code Online (Sandbox Code Playgroud)
scanf读取十进制输入并存储在int中,导致溢出.我该如何检查并避免这种情况?
我正在尝试使用GCC手册中指定的动态读取输入scanf和存储,但它给出了编译时错误.char *
char *string;
if (scanf ("%as",&string) != 1){
//some code
}
else{
printf("%s\n", *string);
free(string);
//some code
}
Run Code Online (Sandbox Code Playgroud) 正如标题所说,我总是想知道为什么scanf必须采取address of运算符(&).
#include <stdio.h>
int main ()
{
char loop='y';
while(loop != 'n') {
printf("loop? ");
scanf("%c", &loop);
if(loop != 'y') {
loop='n';
}
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果我键入'y',他会重新启动while循环,但会在第二次忽略scanf并在此之后结束循环.有人可以帮忙吗?
我是一名新手学习C并尝试从在线讲座中了解以下代码.它扫描字符串中的整数; 如果遇到字符,则sscanf失败.
int n; char c;
if (sscanf(string, " %d %c", &n, &c) == 1)
//return the integer
else
// fail
Run Code Online (Sandbox Code Playgroud)
我已经阅读了sscanf的手册页,我仍然对检查返回值以及此代码的工作原理感到困惑.他们声明"这些函数返回分配的输入项数".
如果sscanf只遇到字符,它会将它们写入&c ...但在这种情况下&n将不会被写入.在这种情况下,我会认为sscanf的返回值仍然是1?
#include <stdio.h>
#include <string.h>
int main() {
char a[100], b[100];
char *ret;
scanf("%[^\n]s", a);
scanf("%[^\n]s", b);
ret = strstr(a, b);
if (ret != NULL)
printf("its a substring");
else
printf("not a substring");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我的目的是检查字符串中父字符串中是否存在子字符串.我strstr()从这里了解了这个功能.
我以前%[^\n]s在我的代码中使用过它们并且运行良好.但是,在这种情况下,只要在键入一个字符串后按返回/输入,输出就是not a substring.
我做错了什么?