来自用户输入的字符串,它被转换为字母图案。
重新发布,因为我的第一篇文章不好。我有一个问题,我不确定如何去做。我知道我要做的过程,但我不完全确定如何将字符串扫描到数组中,以便将每个字符/整数扫描到数组的独立元素中。我会发布到目前为止的问题和代码,任何帮助将不胜感激。来自用户输入的字符串,它被转换为字母图案。
问题:
假设我们有一个像图案如下:([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]);
}
我假设你想要写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;
}
的步骤是:
- 阅读模式
- 检查模式是有效的
- 产生输出
由于输入长度不指定你必须假定一个最大长度。 另一个假设是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("");
}
}
[DEMO](http://ideone.com/9eTshe) – BLUEPIXY
**永远不要**使用'gets'。它已从标准中删除,任何现代编译器/库至少会对其进行警告。使用'fgets'。 – Olaf