繁体   English   中英

如果用户输入“ *”,则添加1;如果用户输入“ C”,则添加0。

[英]Add a 1 if user entered an “*”, or add a 0 if user entered a “ ” to an array in C

我需要接受用户输入(星号或空格),如果用户输入星号,则我将在数组中插入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

有多种方法可以捕获'*'' '并将其分别转换为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

没有正确的方法来执行此操作,因此请查看所有答案并选择最适合您的情况的答案。

您还可以将fgetc与STDIN一起用作文件流,以逐个读取char

编辑添加了带有缓冲区验证的解决方案

#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;
}

好的新代码对我来说非常有效,并在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();
}

这可能不适用于在线编译器

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM