Tag: scanf

%ms和%s scanf之间的差异

阅读scanf手册我遇到这一行: 一个可选的’m’字符。 这用于字符串转换(%s,%c,%[), 有人可以用简单的例子来解释它,在某些情况下说明这种选择的区别和需要吗?

scanf()可变长度说明符

如何使用变量来指定scanf()应该读入的最大字符数? 例如,使用printf()您可以像这样使用* #define MAXVAL 5 printf(“Print at maximum MAXVAL chars: %.*s\n”, MAXVAL, “myStringHere”); 这将只打印5个字符,如何才能使scanf仅在MAXVAL中读取? MAXVAL必须用作长度说明符。 我不能简单地做 scanf(“%5s”, string); 现在我只能想到使用scanf读入一个大型数组,然后使用ssprintf将字符串存储到我的长度限制字符串中。 然而,使用长度说明符会更容易。

什么`scanf(“%* %* c”)`是什么意思?

我想在C中创建一个循环,当程序要求一个整数并且用户键入一个非数字字符时,程序再次请求一个整数。 我刚刚找到了以下代码。 但我不明白这意味着什么是scanf(“%*[^\n]%*c”) 。 ^\n是什么意思? ^\n和c之前的*是什么意思? /* This program calculate the mean score of an user 4 individual scores, and outputs the mean and a final grade Input: score1, score2,score2, score3 Output: Mean, FinalGrade */ #include //#include int main(void){ int userScore = 0; //Stores the scores that the user inputs float meanValue = 0.0f; //Stores […]

fgets()跳过

我正在为学校编写一个程序,用户输入姓名,工作时间和小时工资。 int main () { char name[SIZE]; char selection = ‘Z’; int hoursWorked = 0, counter = 0, flag = 1; float hourlyRate = 0.0; const float otRate = 1.5; const int week = 40; while (flag == 1) { system (“cls”); printf (“\n\tP AYROLLPROGRAM\n”); printf (“———————————————\n”); printf (“\t(A) – New Payroll Info\n\t(B) – Display […]

如何正确安全地使用sscanf

首先,关于sscanf使用的其他问题没有回答我的问题,因为常见的答案是根本不使用sscanf而是使用fgets或getch ,这在我的情况下是不可能的。 问题是我的C教授要我在程序中使用scanf 。 这是一项要求。 但是程序也必须处理所有不正确的输入。 程序必须读取整数数组。 以什么格式提供数组的整数并不重要。 为了使任务更容易,程序可能首先读取数组的大小,然后读取每行中的整数。 程序必须处理这些输入(并适当地报告错误): 999999999999999 … 9(数字大于整数) 12a3(不要将其读作整数12) a … z(字符串) 11 aa 22 33 \ n所有在一行(这可能通过丢弃11之后的所有内容来处理) 输入大于输入数组 可能有更多不正确的案例,这些是我能想到的唯一案例。 如果提供了错误输入,程序必须要求用户再次输入,直到给出正确的输入,但必须保留先前正确的输入(只有输入流中必须清除不正确的输入)。 一切都必须符合C99标准。

使用scanf()读取的字符串大小不超过

编辑:对于我的课,我必须使用scanf 。 所以推荐其他输入方式并不是我正在寻找的解决方案(如果有一个涉及scanf)。 如果我正在阅读小项目的用户输入(例如,游戏)。 可以说我问would you like to play? 这将接受yes或no答案。 所以我写了一些像这样的简单代码: #include int main(void) { char string[3]; //The max number of letters for “yes”. printf(“Would you like to play?”); scanf(“%s”, string); } 所以这段代码应该简单地要求他们输入yes或no 。 我将我的char array的长度设置为3 。 这样它足够大,可以保持yes ,也可以no 。 但是如果有人输入了诸如yesss无效输入,我知道如何比较yesss的字符串来处理这样的事件,但是这不会在技术上/可能覆盖我声明的其他局部变量,因为它会延伸到我的长度之外arrays? 如果是这样,有没有办法处理这个限制3个输入字符或什么? 如果没有,为什么/如何知道只输入3的大小? *注意:我是C的新手,我在这方面找不到多少所以即使这很简单,我也很感激。 因为我显然缺少一些东西。 我来自java背景,这甚至都不是问题。

扫描多个整数而不知道实际的整数数

我必须输入其频率我不知道的值… 例如,第一次输入:1 32 54 65 6 第二输入:2 4 5 我首先想到的是,扫描值,如果新行’\ n’然后打破循环,但那不是很好,所以相反我说我使用字符,然后我的类型转换得到数字,但问题与这也是因为它扫描一个字符,如果它是一个负值,它也是一个问题; 像这样的东西 #include int main(){ int myarray[20]; int i=0, data; while(1){ scanf(“%d”, &data); if (data == ‘\n’) break; myarray[i]=data; } return 0; } 但是,scanf会跳转所有特殊字符并仅查找整数…有没有办法将int扫描到一个数组,当有换行符时它会停止?

字符数组后的奇怪字符

我是C的真正初学者,但我正在学习! 我之前偶然发现了这个问题,并决定询问原因是什么。 请解释一下你的答案,这样我才能学习。 我制作了一个程序,允许您输入5个字符,然后显示您编写的字符并还原它们,例如:“asdfg” – “gfdsa”。 奇怪的是,在输入的原始字符后显示一个奇怪的字符。 这是代码: char str[5]; char outcome[] = “OOOOO”; int i; int u; printf(“Enter five characters\n”); scanf(“%s”, str); for(i = 4, u = 0; i >=0; u++, i–){ outcome[i] = str[u]; } printf(“\nYou wrote: %s. The outcome is: %s.”, str , outcome); return 0; 如果我输入:“asdfg”它显示:“asdfg♣”,为什么? 谢谢你的时间,请解释你的答案:)

动态分配用户输入的字符串

我正在尝试编写一个执行以下操作的函数: 启动输入循环,每次迭代打印’> ‘ 。 取用户输入的任何内容(未知长度)并将其读入字符数组,必要时动态分配数组的大小。 用户输入的行将以换行符结束。 在字符数组的末尾添加一个空字节’\0’ 。 当用户输入一个空行时,循环终止: ‘\n’ 这是我目前写的: void input_loop(){ char *str = NULL; printf(“> “); while(printf(“> “) && scanf(“%a[^\n]%*c”,&input) == 1){ /*Add null byte to the end of str*/ /*Do stuff to input, including traversing until the null byte is reached*/ free(str); str = NULL; } free(str); str = NULL; } […]

C正则表达式如何匹配以“或任何空字符串结尾的任何字符串?

我正在尝试生成代码以逐行读取逗号分隔文本文件中的输入。 我只对3个领域感兴趣,所以我正在跳过剩下的。 问题是2个字段是包含在引号中的字符串,其中一个实际上是可选的。 例如,两个连续的行可能如下所示: 0,,10004,10004,”Albany Hwy After Galliers Av”,””,-32.13649428,116.0176090070,3 0,,10005,10005,”Albany Hwy Armadale Kelmscott Hospital”,”Armadale Kelmscott Hospital”,-32.13481555555560,116.017707222222,3 由于我对字符串不感兴趣(我只对一些数字感兴趣),我只是在scanf中使用*运算符跳过它们。 对于第一个字符串,它很容易,因为这是一个必填字段,所以我可以跳过第一个双引号匹配到一切的正则表达式,直到第二个双引号,如下所示: \”%*[^\”] 我遇到麻烦的是第二个领域,就在第一个领域之后。 问题是这个字段是可选的; 因此它可能有文本,也可能没有。 只要不是这样,上面列出的正则表达式就无法正常工作,整个scanf操作都会失败。 尽管我付出了最大的努力,但我无法生成一个正则表达式,它可以成功匹配第二个双引号之外的所有内容,以及匹配空字符串。 有谁知道如何修改我的正则表达式来执行这样的function? ps这里是我的scanf操作的示例: res = sscanf(buf, “%*d,,%ld,%*ld,\”%*[^\”]\”,\”%*[]\”,%lf,%lf,%*d”, &cursid, &curslat, &curslong);