如何使用变量指定scanf()应读入的最大字符数?
例如使用printf()你可以像这样使用*
#define MAXVAL 5
printf("Print at maximum MAXVAL chars: %.*s\n", MAXVAL, "myStringHere");
Run Code Online (Sandbox Code Playgroud)
这只会打印5个字符,如何才能scanf在MAXVAL中读取?MAXVAL必须用作长度说明符.我不能简单地做
scanf("%5s", string);
Run Code Online (Sandbox Code Playgroud)
现在我只能想到读入一个大数组scanf然后ssprintf用来将字符串存储到我的长度有限的字符串中.然而,使用长度说明符会更容易.
有没有人为Delphi写过'UnFormat'例程?
我想象的是SysUtils.Format的反转,看起来像这样
UnFormat('数字%n和另一个%n',[float1,float2]);
因此,您可以使用格式字符串将字符串解压缩为一系列变量.
我看过SysUtils中的'Format'例程,但我从未使用过汇编,所以对我来说没有意义.
我是C的新手,我在向程序输入数据时遇到了问题.
我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
int a;
char b[20];
printf("Input your ID: ");
scanf("%d", &a);
printf("Input your name: ");
gets(b);
printf("---------");
printf("Name: %s", b);
system("pause");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它允许输入ID,但它只是跳过其余的输入.如果我改变这样的顺序:
printf("Input your name: ");
gets(b);
printf("Input your ID: ");
scanf("%d", &a);
Run Code Online (Sandbox Code Playgroud)
它会工作.虽然,我不能改变秩序,我需要它原样.有人能帮我吗 ?也许我需要使用其他一些功能.谢谢!
Ceteris paribus(格式良好的数据,良好的缓冲实践以及什么不是),是否有理由为什么我更喜欢循环而返回scanf为1,而不是!EOF?我可能已经在某个地方读过这个,或者其他什么,但我也可能错了.其他人怎么想?
当使用的scanf()和它的变体,该格式说明%i将接受作为十六进制数据(加前缀"0x"为),八进制(前缀"0"),或十进制(无前缀),因此,例如字符串"0x10的","020 "和"16"都转换为十进制值为16的整数.
这可以通过std::istream::operator>>格式化输入完成吗?
使用普通的>> i无I/O操纵器"为0x10"被转换成零(或者更确切地说,前导0,则"×10"的部分不被处理),以及"020",以20 hex,oct和dec操纵行为像%x,%o并%d分别.我正在寻找一个像%i.一样的通用整数输入操纵器.
有趣的是,hex操纵器可能同时接受"0x10"和"10"转换为16位小数.
如果您可能想知道,我正在实现一个表达式求值程序,并且我希望使用C/C++前缀约定允许整数操作数为十六进制,八进制或十进制.当前使用的实现sscanf()会自动使用%i,我很好奇是否可以修改它以使用iostream而无需显式解析数字格式.
我想从stdin读取一个数字.我不明白为什么scanf要求在&我的变量名称之前使用:
int i;
scanf("%d", &i);
Run Code Online (Sandbox Code Playgroud)
为什么scanf需要变量的地址?
在这里,我在接受的答案中看到了这个陈述:
大多数转换说明符都跳过前导空格,包括换行符但
%c不跳过.
对我来说,不清楚这种不同行为的基本原理,我会期待一个统一的(例如总是跳过或从不).
我用这样的一段C代码遇到了这种问题:
#include "stdio.h"
int main(void){
char ch;
int actualNum;
printf("Insert a number: ");
scanf("%d", &actualNum);
// getchar();
printf("Insert a character: ");
scanf("%c", &ch);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
交换两个scanf小号解决了问题,以及在(注释)getchar,否则'\n'该第一插入将由所述第二消耗scanf与%c.我在linux和windows上测试了gcc,行为是一样的:
gcc(GCC)4.7.2 20120921(Red Hat 4.7.2-2)
版权所有(C)2012 Free Software Foundation,Inc.
这是免费软件; 查看复制条件的来源.没有保修; 甚至不适用于适销性或特定用途的适用性.
所以我的问题是:为什么%d和%c行为不同WRT '\n'的scanf?
可能重复:
使用scanf进行分段错误
我写了以下代码.
int main(){
char arrays[12];
char *pointers;
scanf("%s",arrays);
scanf("%s",pointers);
printf("%s",arrays);
printf("%s",pointers);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么写作时会出错 scanf("%s",pointers);
如果用户输入整数变量的浮点数,我想打印无效输入.那可能吗?
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但我想要无效输入.
如果代码是
scanf("%s\n",message)
Run Code Online (Sandbox Code Playgroud)
VS
gets(message)
Run Code Online (Sandbox Code Playgroud)
有什么区别?似乎他们都得到了消息的输入.