如果用户输入“*”则添加 1,如果用户输入“”则添加 0 到 C 中的数组
Posted
技术标签:
【中文标题】如果用户输入“*”则添加 1,如果用户输入“”则添加 0 到 C 中的数组【英文标题】:Add a 1 if user entered an "*", or add a 0 if user entered a " " to an array in C 【发布时间】:2016-07-24 05:12:55 【问题描述】:我需要接受用户输入(星号或空格),如果用户输入星号,我会在数组中插入 1,如果用户输入空格,我会在数组中插入 0。这是我目前所拥有的:
#include <stdio.h>
#include <stdlib.h>
void userInput()
printf("Enter Generation 0 (Length must be 10, * for 1 and " " for 0):\n");
char c; /* int */
int count;
char arr[10];
for(int i = 0; i < 10; i++)
scanf("%c", &c);
if(c == '*')
arr[i] = '1';
else
arr[i] = '0';
for(int j = 0; j < 10; j++)
printf("%c", arr[j]);
int main(int argc, const char * argv[])
userInput();
问题是循环只允许用户输入一个字符6次然后打印。
输入所有 * 时输出:
Enter Generation 0 (Length must be 10, * for 1 and for 0):
*
*
*
*
*
1010101010
输入所有空格后输出:
Enter Generation 0 (Length must be 80, * for 1 and for 0):
0000000000
【问题讨论】:
scanf("%c", &c);
--> scanf(" %c", &c);
注意添加的空格,以防止前面的newline
开始读取。
作为 Weather Vane 建议的替代方法,请确保在添加到数组之前输入的字符是星号或空格。 (这可能涉及将 for 循环转为 while,仅当您附加到字符串时,您才会在其中推进 i
。)
如果你使用的是ascii,你可以无条件地将'0' + ((c >> 1)&1)
写入数组。
实际上我的注释修复会失败,因为space
也会被跳过!从space
中选择一个不同的字符,也许是句号'.'
。
这行得通,但是当我输入空格时它不会跟踪。反正我可以跟踪空间?
【参考方案1】:
有许多方法可以捕获'*'
和' '
并将它们分别转换为1
和0
。您实际上是在编写一个小的输入处理程序,它将读取直到您的数组已满,或者用户使用 [ctrl + d] 终止输入。您只需检查以确保阵列未满并且您尚未到达EOF
。一些简单的事情就可以了:
#include <stdio.h>
#define MAXC 10
int main (void)
unsigned char arr[MAXC] = 0;
int c = 0, i, idx = 0;
while (idx < MAXC && (c = getchar()) != EOF)
if (c == '*') arr[idx++] = 1u;
if (c == ' ') arr[idx++] = 0u;
for (i = 0; i < idx; i++)
printf (" arr[%d] : %u\n", i, arr[i]);
return 0;
它将采用任何形式的输入,对'*'
和' '
进行适当的操作,并忽略其他字符,直到数组已满或生成EOF
:
使用/输出示例
$ ./bin/rdspcasterix
(**) (**)
(**)
*
arr[0] : 1
arr[1] : 1
arr[2] : 0
arr[3] : 1
arr[4] : 1
arr[5] : 0
arr[6] : 0
arr[7] : 1
arr[8] : 1
arr[9] : 1
$ ./bin/rdspcasterix
The quick*brown fox*jumps over*a lazy*dog
** **
arr[0] : 0
arr[1] : 1
arr[2] : 0
arr[3] : 1
arr[4] : 0
arr[5] : 1
arr[6] : 0
arr[7] : 1
arr[8] : 1
arr[9] : 1
没有唯一正确的方法可以做到这一点,因此请查看所有答案并选择最适合您情况的答案。
【讨论】:
您应该检查内部循环条件中的EOF
。换行符已经像任何其他字符一样被过滤器忽略了。
嗯,您可以删除换行符的显式检查。为什么应该区别对待例如'A'
?就while ( (idx ...) && ((c = getchar()) != EOF) ) ...
咯咯笑...该死的你在这两个方面都是对的。我想我只是偏爱换行符...您只需要一个循环...
是的,现在它比我的要好。我只是太专注于给出提示,所以 OP 可以自己完成她的作业。但从评论来看,她似乎还没有那么远。
这段代码有效,非常感谢。我接受了这个答案。【参考方案2】:
您也可以使用带有 STDIN 的 fgetc 作为文件流来逐个字符地读取字符
编辑添加了缓冲区验证的解决方案
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#define EXTRACHARS 2
#define SIZE 10
static void clear_buf(void)
int ch;
while(ch = getc(stdin), ch != '\n' && ch!=EOF);
clearerr(stdin);
int main(void)
int c = 0;
char seq[SIZE + EXTRACHARS];
printf("Enter 10 * or ' ': ");
fgets(seq, SIZE+EXTRACHARS, stdin);
if (seq[strlen(seq)- 1] != '\n')
printf("Buffer overflowed \n");
clear_buf();
else
while(c < SIZE)
if(seq[c] == '*')
printf("1");
else if(seq[c] == ' ')
printf("0");
++c;
printf("\n");
return EXIT_SUCCESS;
【讨论】:
添加了使用缓冲安全的解决方案【参考方案3】:在 QT Ide Mingw 编译器上测试的新代码对我来说工作得很好
#include <stdio.h>
#include <stdlib.h>
void userInput()
printf("Enter Generation 0 (Length must be 10, * for 1 and " " for 0):\n");
char c;
char temp;
char arr[10];
int i=0;
do
printf("\nEnter number %d : ", i+1);
c = getchar();
while((temp = getchar()) != '\n' && c != EOF); // this is alternative to fflush
if(c == 42) // 42 is ascii code to *
arr[i] = '1';
else
arr[i] = '0';
i++;
while((c!=EOF)&&(i<10));
for(int j = 0; j < 10; j++)
printf("%c\n", arr[j]);
int main(int argc, const char * argv[])
userInput();
这可能不适用于在线编译器
【讨论】:
我觉得if(c == '*')
会更好
好的,根据用户的舒适度,我会很好,使用 42 或 '*' ty 发表评论:)
这个程序和OP的问题一样。
getchar
故意返回int
。这一点也不比 OP 好。
"// 这是 fflush 的替代品" - 什么? Haow这与fflush有关吗?它是否也调用 UB?以上是关于如果用户输入“*”则添加 1,如果用户输入“”则添加 0 到 C 中的数组的主要内容,如果未能解决你的问题,请参考以下文章
练习:编写循环,让用户输入用户名和密码,如果用户为空或者数字,则重新输入
shell脚本,提示用户输入一个用户名,如果存在;显示用户UID和SHELL信息;否则,则显示无此用户;显示完成之后,提示用户再次输入;如果是quit则退出;
Java循环,直到用户输入值0.值必须介于1-4之间,如果超过4,则要求用户再次尝试输入
07_编写脚本:提示用户输入用户名和密码,脚本自动创建相应的账户及配置密码。如果用户不输入账户名,则提示必须输入账户名并退出脚本;如果用户不输入密码,则统一使用默认的 123456 作为默认密码。