Поиск цифрового значения с использованием строк - PullRequest
1 голос
/ 23 декабря 2011

В качестве учебного упражнения я создаю программу, которая преобразует символы, введенные через argv[1], в целые числа. Затем программа находит цифровое среднее целых чисел.

Например: abc будет 123, а 1+2+3 = 6, шесть - это среднее цифровое значение. Первая часть программы работает, но я не могу правильно кодировать часть, которая находит цифровое среднее значение.

Выход из word abc должен быть 123 6; вместо этого 123 150.


РЕДАКТИРОВАТЬ: Решено!

#include <stdio.h>
#include <strings.h>

int main(int argc, char *argv[])
{
    char stra[27], strb[0];
    int str_num, str_len;
    int final = 0;

    if (argv[1][0] < 'a')
    {
        printf("!Argument missing!");
        return 0;
    }

    strcpy(stra, argv[1]);
    str_len = strlen(stra);

    for (str_num = 0; str_num < str_len; str_num++)
    {
        if (stra[str_num] <= 'z' && stra[str_num] >= 'a')
        {
            strb[str_num] = (stra[str_num] - 'a' + 1) % 9 + '0';
            if (strb[str_num] == '0')
            {
                strb[str_num] = '9';
            }
        }
        else
        {
            printf("%s !Please use only the lower case!", stra);
            return 0;
        }
    }

    for (str_num = 0; str_num < str_len; str_num++)
    {
        final += strb[str_num] - '0';
    }

    printf("%s %i", strb, final);
    return 0;
}

Ответы [ 4 ]

0 голосов
/ 23 декабря 2011
#include <stdio.h>
#include <strings.h>
int main(int argc, char *argv[])
{
    char *stra;
    char *strb;
    int str_num;
    int str_len;
    int final;
    final = 0;
    if ( (argc >= 2 && argv[1][0] < 'a') || (argc <= 1))
    {
        printf("!Argument missing!");
        return 0;
    }
    str_len = strlen(argv[1]);

    strb = (char*) malloc((str_len+1)*sizeof(char));

    for (str_num = 0; str_num < str_len; str_num++)
    {
        if (argv[1][str_num] <= 'z' && argv[1][str_num] >= 'a')
    {
        strb[str_num] = (argv[1][str_num] - 'a'+1) % 9 + '0'; //to get string with numbers from 1 to 9
        }
        else
        {
            printf("%s !Please use only the lower case!",argv[1]);
            return 0;
        }
    }
    strb[str_len] = '\0' // put the end char of the string : mandatory to print it.
    for (str_num = 0; str_num < str_len; str_num++)
    {
        final += strb[str_num] - '0';  // count the sum of the numbers from 1 to 9 ?
    }
    printf("%s %i",strb,final);
    free(strb);
    return 0;
}
0 голосов
/ 23 декабря 2011

Похоже, вы бежите за пределы буфера strb:

char strb[0];
0 голосов
/ 23 декабря 2011
strb[str_num] = (stra[str_num] - 'a') % 9 - 207;

* * * * * * * * * * * * * * - самая большая проблема здесь (кроме вашей ошибки "по одному").Эта строка должна гласить:

strb[str_num] = (stra[str_num] - 'a' + 1) % 9;
0 голосов
/ 23 декабря 2011

При первом осмотре кажется, что ваша программа будет более или менее работать, если бы это было

strb[str_num] = (stra[str_num] - 'a') % 9 + 1

Кроме того, strb также должно быть длиной 27 символов, а не 0; Массивы с 0 элементами довольно слабы для хранения ненулевых объемов данных!

Вам необходимо проверить аргумент, используя argc - т.е.

if (argc != 2)
    // complain here

Наконец, когда вы печатаете результаты, вам нужно превратить порядковые номера обратно в символы. Печать strb как char* не даст вам 123, а скорее ^A^B^C, а не то, что вы хотите. Поэтому вам нужно будет печатать эти символы в цикле, корректируя каждый из них, добавляя смещение '0' обратно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...