天道酬勤,学无止境

scanf

sscanf(str1, "%s %d %f", str2,&num,&float1) 产生意外结果(sscanf(str1, "%s %d %f", str2,&num,&float1) producing unexpected results)

问题 使用包含的库,如何将包含名称、年龄和比率的字符串与存储在数组中的 fgets 的输入分开? 我需要修改字符串、年龄和格式以显示 3 个小数位。 之后,我需要将这些变量的新结果存储在单个字符数组中。 这就是我迄今为止所拥有的。 我不知道是什么导致 sscanf() 给我意想不到的结果或如何解决它 #include <stdio.h> #include <string.h> #include <ctype.h> #include <math.h> #define SIZE 10 #define SIZE2 40 int main(){ char input[SIZE2]={}; char name[SIZE]={}; int age = 0; float rate = 0; printf("Enter name, age and rate (exit to quit): "); fgets(input, SIZE2, stdin); sscanf(input,"%s %d %f", name, &age, &rate); printf("%s %d %.3f",name, &age, &rate); return 0; } 名字显示正常,但是年龄是一些随机的大数字,比率显示为0.000 回答1 删除 printf("%s %d %.3f",name, &age, &rate)

2021-12-05 06:41:28    分类:技术分享    c   input   scanf

如何使用scanf读取由/分隔的字符串(How to read string separated by / with scanf)

问题 我已经尝试了很长一段时间,经过一些研究我没有成功,所以我最后的手段是问一个问题。 我的输入如下所示: 1.0.0.0/255.0.0.0/127.0.0.1/1112 1.2.0.0/255.255.0.0/2.4.6.9/1112 1.2.3.0/255.255.255.0/1.2.3.1/111 我需要从每一行中提取 4 个字符串,例如第一行会给我 s1 = 1.0.0.0 s2 = 255.0.0.0 s3 = 127.0.0.1 s4 = 1112 这是我尝试过的: scanf("%s/%s/%s/%s", str1, str2, str3, str4); // This doesn't consume the "/" scanf("%[^/]s%[^/]s%[^/]s%[^/]s", str1, str2, str3, str4); // This only gets the first string scanf(""%[^\n]s%*c%s%*c%s%*c%s", str1, str2, str3, str4); // Hera %*c was supposed to consume the "/" and do not store it, it doen't happen tho 如何在一段while (!feof(fileIn)

2021-12-02 12:54:32    分类:技术分享    c   file   input   scanf

C中的Scanf字符[重复](Scanf character in C [duplicate])

问题 这个问题在这里已经有了答案: scanf() 将新行字符留在缓冲区中5 个回答 2年前关闭。 出于某种原因, scanf读取字符,但即使字符有效,程序也不会继续经过用于验证字符的 while 循环。 有时它有效,有时它不起作用。 奇怪的是我没有做任何不同的事情。 有任何想法吗? do { printf("Enter \"p\" if you want to sort and shuffle a list of players or enter \"s\" if you want to sort a list of slots: "); // prompt scanf("%c", &tmp); } while (tmp != 'p' && tmp != 's'); 新代码: printf("Enter 'p' if you want to sort and shuffle a list of players or enter 's' if you want to sort a list of slots:"); // prompt tmp = getchar(); printf("%c ",tmp); if (tmp == 'p') { size = readPlayerFile(players); // calling readPlayerFile function

2021-12-01 09:39:07    分类:技术分享    c   character   scanf

C中的&符号(&)和scanf?(Ampersand(&) and scanf in C?)

问题 我有以下多项选择题,我无法弄清楚为什么(A)和(C)是不正确的,任何解释将不胜感激! 以下问题的唯一正确答案是(B)。 以下哪项是 scanf 的正确用法? (A) int i=0; scanf("%d", i); int i=0; scanf("%d", i); (B) int i=0; int *p=&i; scanf("%d", p); int i=0; int *p=&i; scanf("%d", p); (C) char *s="1234567"; scanf("%3s", &s); char *s="1234567"; scanf("%3s", &s); (D) char c; scanf("%c", c); char c; scanf("%c", c); 回答1 scanf想要一个正确的地址来存储结果: (A) int i=0; scanf("%d", i); i这里是按值传递的,没有地址:错误。 (B) int i=0; int *p=&i; scanf("%d", p); p是一个指向 int 的指针, scanf可以在这里存储它的结果:对 (C) char *s="1234567"; scanf("%3s", &s); &s是指向char *的指针的地址,您不能在那里存储字符串:错误 (D) char c; scanf("%c", c); c按值传递

2021-12-01 03:08:15    分类:技术分享    c   pointers   scanf   ampersand

scanf() 的行为 [重复](Behaviour of scanf() [duplicate])

问题 这个问题在这里已经有了答案: 11 年前关闭。 可能的重复: scanf() 与 & 运算符的混淆 为什么我们需要在 scanf 中使用 & 来输入整数,为什么不需要输入字符。 在 scanf 中执行 & 指的是获取输入时的位置。 例如:- main() { int a; char c; scanf("%d",&a); scanf("%c"c); } 回答1 对于每个转换说明符, scanf()期望相应的参数是指向正确类型的指针: %d期望int *类型的参数, %f期望double *类型的参数, %c和%s都期望一个参数类型为char *等。 %c和%s的区别在于前者告诉scanf()读取单个字符并将其存储在相应参数指定的位置,而后者告诉scanf()读取多个字符,直到看到 0-值字符并将所有这些字符存储在缓冲区中,从参数指定的位置开始。 如果参数不是指针类型,则需要在参数上使用&运算符。 例如: int x; int *px = some_valid_memory_location_such_as_&x; char c; char *pc = some_valid_memory_location_such_as_&c; ... scanf("%d", &x); // x is not a pointer type, so we must use the &

2021-11-30 03:30:18    分类:技术分享    c   scanf

用 scanf 读取 int 直到换行(read int with scanf until new line)

问题 我是 c 语言的新手,之前用过 java,所以我对一些东西不是很熟悉……我想读取不确定数量的整数,直到有一个新行。 我知道,那个新行是 ⁄n 并且我已经有了一个代码,所以在你输入一个字母之前会读取整数,但如果有新行,它不会停止。 #include <stdio.h> int main() { int i, numberOfNumbs=0,total=0,value, valsRead; float average; valsRead = scanf("%d",&value); while(valsRead>0) { numberOfNumbs++; total +=value; printf("Read %d\n", value); valsRead = scanf("%d",&value); } average=(float)total/(float)numberOfNumbs; printf("You read %d values. Average = %f.",numberOfNumbs, average); return (0); } 输入应该是这样的:23 4 114 2 34 3224 3 2 ⁄n 提前致谢 回答1 scanf在设计上不是面向行的。 它针对空格分隔的输入,其中空格是空格、制表符、\r 或\n 的任意组合。 如果你想使用面向行的输入

2021-11-29 20:39:13    分类:技术分享    c   string   int   newline   scanf

如何防止用户输入字母或数字?(How to prevent users from inputting letters or numbers?)

问题 我有一个简单的问题; 这是代码: #include<stdio.h> main(){ int input; printf("Choose a numeric value"); scanf("%d",&input); } 我希望用户只输入数字......所以它必须是这样的: #include<stdio.h> main(){ int input; printf("Choose a numeric value"); do{ scanf("%d",&input); }while(input!= 'something'); } 我的问题是我不知道在“某物”中替换什么......如何防止用户输入字母字符? 编辑 我刚得到一些有趣的东西: #include<stdio.h> main(){ int input; printf("Choose a numeric value"); do{ scanf("%d",&input); }while(input!= 'int'); } 只要我输入数字,添加 'int' 就会一直循环,我尝试了 'char' 但这没有用 .. 肯定有字母的东西吗? :S 请回复! 谢谢你的帮助 ! 回答1 strtol库函数将数字的字符串表示形式转换为其等效的整数值,并且还将设置指向与有效数字不匹配的第一个字符的指针。 #include <stdio.h>

2021-11-29 01:45:47    分类:技术分享    c   scanf

为什么 scanf 扫描空值(why scanf scans a null value)

问题 在下面的代码中: #include <stdio.h> int main(){ char *name; int age; char *gen; printf("Your name:"); scanf("%s",name); printf("Your age:"); scanf("%d",&age); printf("Your gender:"); scanf("%s",gen); printf("*****************\n"); printf("%s is a %d years old %s \n",name,age,gen); return 0; } 当我像这样运行它时: Your name:tom Your age:20 Your gender:male ***************** tom is a 20 years old (null) 如您所见,gen 是一个空值,为什么scanf读入 gen 失败,但前两次读取成功? 回答1 char *name; char *gen; 只是字符指针,什么也不指向。 所以需要为它分配内存。 您可以为它分配内存,例如 char *name = malloc(100); char *gen = malloc(100); 或定义具有预定义长度的字符数组 char name[100]; char gen[100]

2021-11-28 16:35:27    分类:技术分享    c   scanf

scanf 是否保证在失败时不会更改值?(Is scanf guaranteed to not change the value on failure?)

问题 如果scanf系列函数无法匹配当前说明符,是否允许写入成功时将存储值的存储? 在我的系统上,以下输出213两次,但这能保证吗? 标准(C99 或 C11)中的语言似乎没有明确规定原始值应保持不变(无论是否不确定)。 #include <stdio.h> int main() { int d = 213; // matching failure sscanf("foo", "%d", &d); printf("%d\n", d); // input failure sscanf("", "%d", &d); printf("%d\n", d); } 回答1 C11标准的相关部分是(7.21.6.2,fscanf): 7 作为转换规范的指令定义了一组匹配的输入序列,如下文对每个说明符的描述。 转换规范按以下步骤执行: 8 […] 9 从流中读取输入项,除非规范包括 n 说明符。 输入项被定义为最长的输入字符序列,它不超过任何指定的字段宽度,并且是匹配输入序列的前缀或前缀。285) 输入项之后的第一个字符(如果有)保持未读状态. 如果输入项的长度为零,则指令执行失败; 这种情况是匹配失败,除非文件结束、编码错误或读取错误阻止了来自流的输入,在这种情况下是输入失败。 10 除了 % 说明符的情况外,输入项(或者,在 %n 指令的情况下,输入字符的计数)被转换为适合转换说明符的类型。

2021-11-28 16:27:42    分类:技术分享    c   scanf   language-lawyer

使用“D”而不是“E”读取ASCII数字以使用C进行科学记数法(Reading ASCII numbers using "D" instead of "E" for scientific notation using C)

问题 我有一个数字列表,看起来像这样: 1.234D+1或1.234D-02 。 我想使用 C 读取文件。函数atof只会忽略D并只翻译尾数。 函数fscanf将不接受格式'%10.6e'因为它需要指数中的E而不是D 当我在 Python 中遇到这个问题时,我放弃了,只是在从字符串转换为浮点数之前使用了字符串替换。 但在 C 中,我相信一定有另一种方式。 那么,您将如何使用D而不是E作为科学记数法来读取带有数字的文件? 请注意,我的意思不是如何读取字符串本身,而是如何将它们转换为浮点数。 谢谢。 回答1 您可以利用 strtod 和 strtok: #include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { char in[] = "1.234D+1 ABCD 1.234D-02 5\n"; char *cursor; char *endp; for ( cursor = strtok(in, " "); cursor; cursor = strtok(NULL, " ")) { double d = strtod(cursor, &endp); if ( *endp == 'D' ) { *endp = 'e'; d = strtod(cursor, &endp); } if ( endp

2021-11-28 16:04:49    分类:技术分享    c   string   scanf   scientific-notation   atof