如何从字符串

时间:2017-03-18 17:33:06

标签: c string integer string-formatting

我正在尝试传递字符串S作为输入。这里字符串S可以包含多个整数值,后跟字母表。程序必须根据之前的整数值扩展字母表。

考虑输入:4a5h 对于哪个输出:aaaahhhhh,即4次a和5次h

同样适用于输入:10a2b 输出:aaaaaaaaaabb,即a的10倍和b

的2倍

这是我的代码:

#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[]数组不包含1001作为其元素1 0是其要素。

如何更正此代码?

3 个答案:

答案 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数组

我要为你留下代码。