Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 用户输入中转换为字母模式的字符串。_C_Arrays_String - Fatal编程技术网

C 用户输入中转换为字母模式的字符串。

C 用户输入中转换为字母模式的字符串。,c,arrays,string,C,Arrays,String,转载,因为我的第一篇帖子不好。我有一个问题,我真的不知道该怎么办。我知道我要执行的过程,但不完全确定如何将字符串扫描到数组中,以便将每个字符/整数扫描到数组的独立元素中。我将发布我到目前为止的问题和代码,任何帮助都将不胜感激 问题: 假设我们有如下模式:([n][letter])+,其中n是一个整数,letter是a-z中的一个小写字母。例如,2a和3b是基于我们的模式的有效表达式。此外,模式末尾的“+”表示至少附加了一个表达式(字符串)或多个表达式。例如,2A4是另一个与模式匹配的有效表达式。

转载,因为我的第一篇帖子不好。我有一个问题,我真的不知道该怎么办。我知道我要执行的过程,但不完全确定如何将字符串扫描到数组中,以便将每个字符/整数扫描到数组的独立元素中。我将发布我到目前为止的问题和代码,任何帮助都将不胜感激

问题:

假设我们有如下模式:([n][letter])+,其中n是一个整数,letter是a-z中的一个小写字母。例如,2a和3b是基于我们的模式的有效表达式。此外,模式末尾的“+”表示至少附加了一个表达式(字符串)或多个表达式。例如,2A4是另一个与模式匹配的有效表达式。在这个问题中,我们希望将这些有效表达式转换为一个字符串,其中字母重复n次

o从用户处读取表达式(字符串),并在输出中打印表达式的转换版本

o检查输入表达式是否有效。例如,2ab不是有效的表达式。如果表达式无效,请在输出中打印“Invalid”,并要求用户输入另一个表达式

o样本输入1=“2a”,输出=aa

o样本输入2=“2a3b”,输出=aabbb

o如果您简要说明您可以使用什么概念或理论来检查表达式是否有效,您将获得额外学分

到目前为止,我所拥有的:

#include <stdio.h>

int main()

{
    int size, i, j;
    char pattern[20];
    char vowel[20];
    int count[20];
    printf("Please enter your string: ");
    gets(pattern);
    size = strlen(pattern);

    for(i=0; i<size; i++)
        if((i+1)%2  == 0)
            vowel[i] = pattern[i];
        else if((i+1)%2 != 0)
            count[i] = pattern[i];

    for(i=0; i<size/2; i++);
        for(j=0; j<count[i]; j++)
            printf("%s", vowel[i]);
}
#包括
int main()
{
int-size,i,j;
字符模式[20];
字符元音[20];
整数计数[20];
printf(“请输入您的字符串:”);
获取(模式);
尺寸=strlen(图案);

对于(i=0;i我假设您要在stderr上写入“invalid\n”字符串。如果不这样做,只需更改为write指定的文件描述符即可

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

#define MAX_INPUT_SIZE 20

int
check_input(char *input)
{
  while (*input)
    {
      if (*input < '0' || *input > '9')
        {
          write(2, "invalid\n", 8);
          return 1;
        }
      while (*input >= '0' && *input <= '9')
        input++;
      if (*input < 'a' || *input > 'z')
        {
          write(2, "invalid\n", 8);
          return 1;
        }
      input++;
    }
  return 0;
}

void
print_output(char *input)
{
  int i;

  while (*input)
    {
      i = atoi(input);
      while (*input >= '0' && *input <= '9')
        input++;
      for (; i > 0; i--)
        write(1, input, 1);
      input++;
    }
  write(1, "\n", 1);
}

int
main()
{
  char input[MAX_INPUT_SIZE];

  do
    {
      printf("Please enter your string: ");
      fgets(input, MAX_INPUT_SIZE, stdin);
      input[strlen(input) - 1] = '\0';
    }
  while (check_input(input));
  print_output(input);
  return 0;
}
#包括
#包括
#包括
#包括
#定义最大输入大小20
int
检查输入(字符*输入)
{
while(*输入)
{
如果(*输入<'0'| |*输入>'9')
{
写入(2,“无效\n”,8);
返回1;
}
而(*输入>='0'&&&*输入'z')
{
写入(2,“无效\n”,8);
返回1;
}
输入++;
}
返回0;
}
无效的
打印输出(字符*输入)
{
int i;
while(*输入)
{
i=atoi(输入);
而(*input>='0'&&&*input 0;i--)
写入(1,输入,1);
输入++;
}
写入(1,“\n”,1);
}
int
main()
{
字符输入[最大输入大小];
做
{
printf(“请输入您的字符串:”);
fgets(输入,最大输入大小,标准输入);
输入[strlen(输入)-1]='\0';
}
while(检查_输入(输入));
打印输出(输入);
返回0;
}
步骤如下:

  • 阅读模式
  • 检查模式是否有效
  • 产生产出
  • 由于未指定输入长度,因此必须假定最大长度。 另一个假设是
    n
    是一个单位数

    现在,您可以使用
    fgets()
    读取整个表达式,也可以逐字符读取。 后者允许您在阅读时检查有效性

    让我们使用
    fgets()
    以方便起见,并防止表达式需要存储以供以后使用

    char exp[100]; // assuming at most 50 instances of ([n][letter])
    int len;
    
    printf("Input: ");
    fgets(exp, 100, stdin);
    len = strlen(exp) - 1;    // Discard newline at end
    
    空输入无效。有效的表达式长度应为偶数

    if (len == 0 || len%2 != 0) {
        printf("Invalid-len\n");
        return 1;
    }
    
    现在解析表达式并将数字和字母分别存储在两个数组中

    char nums[50], letters[50];
    invalid = 0;
    for (i = 0, j = 0; i < len; i += 2, j++) {
        if (exp[i] >= '1' && exp[i] <= '9') {
            nums[j] = exp[i] - '0';
        } else {
            invalid = 1;
            break;
        }
    
        if (exp[i+1] >= 'a' && exp[i+1] <= 'z') {
            letters[j] = exp[i+1];
        } else {
            invalid = 1;
            break;
        }
    }
    
    对于有效的表达式,请运行嵌套循环以打印输出。
    外部循环对每个([n][letter])模式进行迭代。 内部循环打印n乘以字母

    printf("Output: ");
    for (i = 0; i < len/2; i++) {
        for (j = 0; j < nums[i]; j++)
            printf("%c", letters[i]);
    }
    
    printf(“输出:”);
    对于(i=0;i
    这是解决此类问题的一种相当幼稚的方法。最好使用正则表达式。 C标准库不支持正则表达式。但是在类似Unix的系统上,您可以这样使用。

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    #include <stdbool.h>
    
    #define prompt "Please enter your string: "
    
    void occurs_error(const char *src, const char *curr){
        printf("\nInvalid\n");
        printf("%s\n", src);
        while(src++ != curr){
            putchar(' ');
        }
        printf("^\n");
    }
    
    bool invalid(char *pattern){
        char *p = pattern;
        while(*p){
            if(!isdigit((unsigned char)*p)){//no number
                occurs_error(pattern, p);
                break;
            }
            strtoul(p, &p, 10);
            if(!*p || !islower((unsigned char)*p)){//no character or not lowercase
                occurs_error(pattern, p);
                break;
            }
            ++p;
        }
        return *p;
    }
    
    int main(void){
        char pattern[20];
    
        while(fputs(prompt, stdout), fflush(stdout), fgets(pattern, sizeof pattern, stdin)){
            pattern[strcspn(pattern, "\n")] = 0;//chomp newline
    
            char *p = pattern;
            if(invalid(p)){
                continue;
            }
            while(*p){
                int n = strtoul(p, &p, 10);
                while(n--)
                    putchar(*p);
                ++p;
            }
            puts("");
        }
    }
    
    #包括
    #包括
    #包括
    #包括
    #包括
    #定义提示“请输入您的字符串:”
    无效发生\u错误(常量字符*src,常量字符*curr){
    printf(“\n无效\n”);
    printf(“%s\n”,src);
    while(src++!=curr){
    putchar(“”);
    }
    printf(“^\n”);
    }
    bool无效(字符*模式){
    char*p=模式;
    而(*p){
    如果(!isdigit((无符号字符)*p)){//没有数字
    发生错误(模式,p);
    打破
    }
    斯特图尔(p&p,10);
    如果(!*p | |!islower((无符号字符)*p)){//无字符或非小写
    发生错误(模式,p);
    打破
    }
    ++p;
    }
    返回*p;
    }
    内部主(空){
    字符模式[20];
    while(fputs(提示符、标准输出)、fflush(标准输出)、fgets(模式、模式大小、标准输入)){
    pattern[strcspn(pattern,“\n”)]=0;//chomp换行符
    char*p=模式;
    if(无效(p)){
    继续;
    }
    而(*p){
    int n=strtoul(p&p,10);
    而(n--)
    putchar(*p);
    ++p;
    }
    认沽权(“”);
    }
    }
    
    永远不要使用
    get
    。它已从标准中删除,任何现代编译器/库都至少会对此发出警告。请使用
    fgets
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    #include <stdbool.h>
    
    #define prompt "Please enter your string: "
    
    void occurs_error(const char *src, const char *curr){
        printf("\nInvalid\n");
        printf("%s\n", src);
        while(src++ != curr){
            putchar(' ');
        }
        printf("^\n");
    }
    
    bool invalid(char *pattern){
        char *p = pattern;
        while(*p){
            if(!isdigit((unsigned char)*p)){//no number
                occurs_error(pattern, p);
                break;
            }
            strtoul(p, &p, 10);
            if(!*p || !islower((unsigned char)*p)){//no character or not lowercase
                occurs_error(pattern, p);
                break;
            }
            ++p;
        }
        return *p;
    }
    
    int main(void){
        char pattern[20];
    
        while(fputs(prompt, stdout), fflush(stdout), fgets(pattern, sizeof pattern, stdin)){
            pattern[strcspn(pattern, "\n")] = 0;//chomp newline
    
            char *p = pattern;
            if(invalid(p)){
                continue;
            }
            while(*p){
                int n = strtoul(p, &p, 10);
                while(n--)
                    putchar(*p);
                ++p;
            }
            puts("");
        }
    }