我正在尝试传递字符串S作为输入。这里字符串S可以包含多个整数值,后跟字母表。程序必须根据之前的整数值扩展字母表。
考虑输入:4a5h
对于哪个输出:aaaahhhhh
,即4次a
和5次h
同样适用于输入:10a2b
输出:aaaaaaaaaabb
,即a
的10倍和b
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char s[1000], alp[1000];
int num[1000];
int n = 0;
int i, j, k, m;
k = 0;
scanf("%[^\n]s", s);//Reads string until newline character is encountered
for (i = 0; i < strlen(s); i++) {
if (isalpha(s[i])) {
alp[n] = s[i]; // alp[] stores the alphabets
n += 1;
} else {
num[k] = s[i] - '0';// num[] stores the numbers
k += 1;
}
}
for (i = 0; i < k; i++) {
for (m = 0; m < num[i]; m++)
printf("%c", alp[i]);
}
return 0;
}
但是使用此代码我无法读取2或3或N位数字。因此,如果输入为100q1z
,那么alp[]
数组就可以了,但num[]
数组不包含100
和1
作为其元素1
0
是其要素。
如何更正此代码?
答案 0 :(得分:2)
您应该修改循环以处理字符串中连续出现的数字:
#include <ctype.h>
#include <stdio.h>
int main(void) {
char s[1000], alp[1000];
int num[1000];
int i, k = 0, m, n;
//Read string until newline character is encountered
if (scanf("%999[^\n]", s) == 1) {
for (i = 0; s[i]; i++) {
n = 1;
if (isdigit((unsigned char)s[i])) {
for (n = s[i++] - '0'; isdigit((unsigned char)s[i]); i++) {
n = n * 10 + s[i] - '0';
}
}
if (isalpha((unsigned char)s[i])) {
alp[k] = s[i]; // store the letter
num[k] = n; // store the number
k += 1;
}
}
for (i = 0; i < k; i++) {
for (m = 0; m < num[i]; m++)
putchar(alp[i]);
}
}
putchar('\n');
return 0;
}
注意:
<ctype.h>
以使用isalpha()
。scanf
并检查返回值。%[^\n]
,尾随s
不正确。请注意,与fgets()
不同,如果该行为空,则此scanf()
格式将失败。scanf()
。char
参数转换为isalpha()
,将isdigit()
转换为(unsigned char)
,以避免在char
签名且值为负值时出现未定义的行为。putchar(c)
输出单个字符而不是printf("%c", c);
答案 1 :(得分:1)
else-bolock的部分必须循环。
像这样#include <stdio.h>
#include <stdlib.h>
#include <ctype.h> //need this for isalpha and isdigit
int main(void){
char s[1000], alp[1000];
int num[1000];
int m = 0, n = 0;
int i, j;
unsigned char ch;//convert char to unsigned char before use isalpha and isdigit
scanf("%999[^\n]", s);//remove s after [^\n] and Add limit
for(i = 0; ch = s[i]; i++){//replace strlen each loop
if(isalpha(ch)){
alp[n++] = s[i];
} else if(isdigit(ch)){
num[m] = 0;
while(isdigit(ch = s[i])){
num[m] = num[m] * 10 + s[i] - '0';
++i;
}
++m;
--i;//for ++i of for-loop
} else {//Insufficient as validation
printf("include invalid character (%c).\n", ch);
return -1;
}
}
for(i = 0; i < m; i++){
for(j = 0; j < num[i]; j++)
printf("%c", alp[i]);
}
puts("");
return 0;
}
答案 2 :(得分:0)
代码的问题在于,当您在字符串中遇到数字时,您将其视为数字并将其存储在num数组中。
如果阵列中只有单个数字,则可以。
对于多位数,请执行此操作 - 读取数字的字符串,直到找到字母,使用获得的数字形成数字,然后将其保存到num数组 。
我要为你留下代码。