如果用户输入“*”则添加 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", &amp;c); --> scanf(" %c", &amp;c); 注意添加的空格,以防止前面的newline 开始读取。 作为 Weather Vane 建议的替代方法,请确保在添加到数组之前输入的字符是星号或空格。 (这可能涉及将 for 循环转为 while,仅当您附加到字符串时,您才会在其中推进 i。) 如果你使用的是ascii,你可以无条件地将'0' + ((c &gt;&gt; 1)&amp;1)写入数组。 实际上我的注释修复会失败,因为space 也会被跳过!从space 中选择一个不同的字符,也许是句号'.' 这行得通,但是当我输入空格时它不会跟踪。反正我可以跟踪空间? 【参考方案1】:

有许多方法可以捕获'*'' ' 并将它们分别转换为10。您实际上是在编写一个小的输入处理程序,它将读取直到您的数组已满,或者用户使用 [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 ...) &amp;&amp; ((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 作为默认密码。