Tag: scanf

C scanf()和fgets()问题

我正在尝试读取用户输入并将其存储为包含空格的字符串。 我搜索了一个解决方案,并指向fgets()或scanf(%[^ \ n],str)。 但这两种解决方案都给我一个错误。 这就是我所拥有的: //MAX_CHARACTERS is set to 30 scanf(“%d”, &input); if (input == 1){ int pr; char na[MAX_CHARACTERS+1]; printf(“\nEnter the name: “); scanf(“%[^\t\n]”, &na); while (strlen(na)>MAX_CHARACTERS){ printf(“\nName is too long, enter new name: “); scanf(“%[^\t\n]”, &na); }// end na check printf(“\nEnter priority: “); scanf(“%d”, &pr); while (pr>MAX_PRIORITY || pr <MIN_PRIORITY){ printf("\nBad priority, […]

sscanf被认为是安全的吗?

我对sscanf很糟糕的建议有一些模糊的记忆。 我知道如果我使用字段宽度说明符,它不会溢出缓冲区,所以我的记忆只是在玩弄技巧吗?

何时使用printf / scanf vs cout / cin?

我正在使用MinGW的g ++测试我在网上发现的一些片段。 这是C ++编译器……为什么它正确地编译C ….为什么人们交织在一起C和C ++。 具体问题是:使用C和C ++并在g ++下编译是否可以。 如果答案是肯定的,那么我的生活很简单,因为我不需要修改代码。 奇怪的是……让一些C ++工作,特别是在将字符串传递给ifstream构造函数时,它需要一个C类型的字符串…… 我的猜测是,因为C ++有时依赖于C构造,所以可以将两种语言一起编写。 但是,作为一种风格问题,你应该选择cout / cin或printf / scanf 。

使用带有指向字符的指针的scanf函数

可能重复: 使用scanf进行分段错误 我写了以下代码。 int main(){ char arrays[12]; char *pointers; scanf(“%s”,arrays); scanf(“%s”,pointers); printf(“%s”,arrays); printf(“%s”,pointers); return 0; } 当我写scanf(“%s”,pointers);时,为什么会出错scanf(“%s”,pointers);

getchar()等效于scanf(“%c”)和putchar()等效于printf(“%c”)?

a = getchar()等效于scanf(“%c”,&a); ? putchar(a)等同于printf(“%c”,a); 其中a是char变量?

尝试在结构上使用scanf时出现分段错误

我对c很陌生,此刻我也非常沮丧。 这是我的代码: typedef struct { char* fName; char* lName; char* pNum; char* address; char* email; } contactInfo; void addContact(){ contactInfo *contact; contact = (contactInfo *) malloc (sizeof(contactInfo)); printf(“\n[Add a contact]\nFirst Name: “); scanf(“%s”, contact->fName); printf(“%s”, contact->fName); } 出于某种原因,当我输入scanf的值时,它会给我一个分段错误。 如果我尝试在contact-> fName前添加&,我也会收到错误。 代码有什么问题?

如何将字符串可移植转换为不常见的整数类型?

一些背景:如果我想用,例如, scanf()将字符串转换为标准整数类型,如uint16_t ,我将使用 SCNu16 ,如下所示: #include #include uint16_t x; char *xs = “17”; sscanf(xs, “%” SCNu16, &x); 但是像pid_t这样的更不常见的整数类型没有任何这样的东西; 仅支持普通的整数类型。 要转换为另一种方式,可移植printf()一个pid_t ,我可以将它转换为intmax_t并使用PRIdMAX ,如下所示: #include #include #include pid_t x = 17; printf(“%” PRIdMAX, (intmax_t)x); 但是,似乎没有办法将scan scanf()移植到pid_t 。 所以这是我的问题:如何便携? #include #include pid_t x; char *xs = 17; sscanf(xs, “%u”, &x); /* Not portable! pid_t might not be int! […]

`strtod(“3ex”,&end)应该是什么结果? 怎么样`sscanf`?

在我的实验中这个表达 double d = strtod(“3ex”, &end); 用3.0初始化d并将end指针放在输入字符串中的’e’字符处。 这正如我所期望的那样。 ‘e’字符可能看起来是指数部分的开头,但由于缺少实际指数值(6.4.4.2要求),因此’e’应被视为完全独立的字符。 但是,当我这样做的时候 double d; char c; sscanf(“3ex”, “%lf%c”, &d, &c); 我注意到sscanf消耗%lf格式说明符的’3’和’e’ 。 变量d接收3.0值。 变量c以’x’结尾。 这看起来很奇怪有两个原因。 首先,由于语言规范在描述%f格式说明符的行为时引用了strtod ,我直观地期望%lf以与strtod相同的方式处理输入(即选择与终止点相同的位置)。 但是,我知道历史上scanf应该返回不超过一个字符回输入流。 这限制了任何超前scanf的距离可以由一个字符执行。 上面的例子需要至少两个字符前瞻。 所以,假设我接受%lf从输入流中消耗’3’和’e’的事实。 但后来我们遇到了第二个问题。 现在sscanf必须将”3e”转换为double类型。 “3e”不是浮点常数的有效表示(同样,根据6.4.4.2,指数值不是可选的)。 我希望sscanf将此输入视为错误:在%lf转换期间终止,返回0并保持d和c不变。 但是,上面的sscanf成功完成(返回2 )。 这种行为在标准库的GCC和MSVC实现之间是一致的。 所以,我的问题是,在C语言标准文档中它确实允许sscanf如上所述行为,参考上述两点:消耗比strtod更多的function并成功地将这样的序列转换为”3e” ? 通过查看我的实验结果,我可以“反向工程” sscanf的行为:消耗尽可能多的“看起来正确”从不退后,然后将消耗的序列传递给strtod 。 那种’e’被%lf消耗然后被strtod忽略的方式。 但究竟是语言规范中的所有内容吗?

旧的(类C)fscanf方法的现代等价(C ++)样式是什么?

如果我想在使用分号分隔符读取文件时将旧C代码“升级”为更新的C ++,那么最佳选择是什么: /* reading in from file C-like: */ fscanf(tFile, “%d”, &mypost.nr); /*delimiter ; */ fscanf(tFile, ” ;%[^;];”, mypost.aftername);/* delimiter ; */ fscanf(tFile, ” %[^;]”, mypost.forename); /*delimiter ; */ fscanf(tFile, ” ;%[^;];”, mypost.dept);/*delimiter ; */ fscanf(tFile, ” %[^;];”, mypost.position);/* delimiter ; */ fscanf(tFile, “%d”, &mypost.nr2); //eqivalent best C++ method achieving the same thing?

用sscanf读日期

我必须使用带有以下代码行的sscanf从char *字符串中读取日期格式(dd-mm-yyyy;): sscanf(string, “%[^-]-%[^-]-%[^;];”, day, month, year) 其中日/月/年是每个3/3/5元素的字符串*。 这样它可以工作但是当我尝试使用day / moth / year作为integer变量(使用相同的sscanf )时,当我在它们上使用printf时,我得到了0 0 0值。 如果我改变sscanf sscanf(string, “%d-%d-%d;”, day, month, year) 我有segmentation fault 。 有人可以帮帮我吗? 使用K&R书,我找不到解决方案。