来自用户输入的字符串,它被转换为字母图案。

问题描述:

重新发布,因为我的第一篇文章不好。我有一个问题,我不确定如何去做。我知道我要做的过程,但我不完全确定如何将字符串扫描到数组中,以便将每个字符/整数扫描到数组的独立元素中。我会发布到目前为止的问题和代码,任何帮助将不胜感激。来自用户输入的字符串,它被转换为字母图案。

问题:

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

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

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

●样品输入1 =“2A”,输出= AA

●样品输入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]); 
} 
+1

**永远不要**使用'gets'。它已从标准中删除,任何现代编译器/库至少会对其进行警告。使用'fgets'。 – Olaf

我假设你想要写stderr上 “无效\ n” 字符串。如果不仅仅是改变给定的文件描述符。

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

的步骤是:

  1. 阅读模式
  2. 检查模式是有效的
  3. 产生输出

由于输入长度不指定你必须假定一个最大长度。 另一个假设是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; 
    } 
} 

请注意,在每次迭代中,如果第一个字符不是数字或第二个字符不是字母,则该表达式被认为是无效的。 如果发现表达式无效,则无事可做。

if (invalid) { 
    printf("Invalid\n"); 
    return 1; 
} 

对于有效的表达式运行嵌套循环来打印输出。
外循环对每个([n] [字母])模式进行迭代。 内圈打印n乘以字母

printf("Output: "); 
for (i = 0; i < len/2; i++) { 
    for (j = 0; j < nums[i]; j++) 
     printf("%c", letters[i]); 
} 

这是一个相当天真的方式来解决这种类型的问题。使用正则表达式更好。 C标准库不具有正则表达式支持。但是在类Unix系统上,您可以使用POSIX regular expressions

这样

#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(""); 
    } 
} 
+0

[DEMO](http://ideone.com/9eTshe) – BLUEPIXY