2016-10-30 2 views
1

Я пишу простую программу массива struct. Строка дана, и я хочу ее проанализировать. Строка состоит из нескольких символов.Установить массив struct в C

Например, строка «a: bc: D: E» имеет 5 уникальных символов. Colon ":" говорит, что этот символ имеет значение.

Размер массива Struct 256 ((опция [256])), который включает в себя все символы ASCII.

Из данной строки я хочу найти символы и заполнить массив структур со значением «1» в их позиции ASCII. Если в строке нет символа, назначьте значение «0».

Далее я хочу установить «hasVal», поданный этой структурой. Например, a = 1 (имеет двоеточие в заданной строке), b = 0 (без двоеточия после «b» в строке), c = 1 , D = 1, E = 1.

Наконец, распечатать эту структуру, как показано на ожидаемом выходе.

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

Любая помощь приветствуется. Спасибо заранее.

sample.c

#include <stdio.h> 
#include <stdlib.h> 

#define MAX_CHAR 256 

typedef struct { 
    int hasVal; 
    char *defaultVal; 
    char *desc; 
} validOpt; 

validOpt option[MAX_CHAR] = {}; 

char *optStr = "a:bc:D:E"; 


int main() { 

int i; 
for(i = 0; *(optStr + i); i++) 
{ 
    /* Not Sure how to check this.... 
    * check the "char" and ":", 
    * if both are present, set the field "hasVal" to 1 or "0". 
    */ 
    if((optStr[i]++) == ":") 
     option[optStr[i]--].hasVal = 1; 
    else 
     option[optStr[i]--].hasVal = 0; 

} 
printf(“Printing structure…\n”); 
printf("\n"); 
for(i=0; i< MAX_CHAR; i++) 
{ 
    if(option[optStr[i]].hasVal == 1) { 
      printf(" %d -- %c\n", i , option[optStr[i]].hasVal); 
    } 

} 

return 0; 
} 

Фактический выход:

[rock12/C_Prog]$ ./sample 
Printing structure… 

Не получая ничего после этой строки.

Ожидаемый результат:

1) If user enters invalid character, give an error. 
    For Example, "q" -> not valid option 

2) For Valid options, print: 
    a - 1 
    b - 0 
    c - 1 
    D - 1 
    E - 1 
+3

"Это не работает" не является хорошим описанием проблемы. Что он делает, чего вы не ожидаете? Что это не значит, что вы ожидаете? Как вы пытались его отладить? Какие результаты вы получили? –

+0

Благодаря @DavidSchwartz за вашу помощь и время. Я не могу распечатать структуру. Я просто хочу проанализировать строку и найти символы и присвоить значение элементам структуры. – mehtame026

ответ

0
if(option[optStr[i]].hasVal == 1) { 
    printf(" %d -- %c\n", i , option[optStr[i]].hasVal); 

Это условие не достаточно. Вам нужно различать символы, которые появляются и не отображаются в строке, и символы, которые имеют или не имеют значений.

Вам нужна дополнительная переменная, например is_shown, чтобы выяснить, встречается ли символ или нет.

#define MAX_CHAR 256 

char диапазон от нуля до 128. В вашем примере, кажется, достаточно, чтобы перейти от A к z. Но давайте сохраним его на уровне 128.

for(i = 0; *(optStr + i); i++) 
{ 
    if((optStr[i]++) == ":") 
    { 
     ... 
    } 
} 

Приведенная выше ошибка отсутствует. Когда вы дойдете до последнего символа в строке, которую вы еще раз увеличите, чтобы проверить следующие символы, она переместится.

Измените код следующим образом:

typedef struct 
{ 
    int is_show; 
    int hasVal; 
    char *defaultVal; 
    char *desc; 
} validOpt; 

#define MAX_CHAR 128 
int main() 
{ 
    validOpt option[MAX_CHAR] = { 0 }; 
    char *optStr = "a:bc:D:E"; 
    while (*optStr) 
    { 
     char ch = *optStr; 
     option[ch].hasVal = 0; 
     if (ch != ':') 
      option[ch].is_show = 1; 

     if (*(optStr + 1)) 
      if (*(optStr + 1)== ':') 
       option[ch].hasVal = 1; 

     *optStr++; 
    } 

    printf("Printing structure\n\n"); 
    int i; 
    for (i = 0; i < 128; i++) 
     if (option[i].is_show == 1) 
      printf(" %c -- %d\n", i, option[i].hasVal); 
    return 0; 
} 

Выход заключается в следующем:

D -- 1 
E -- 0 
a -- 1 
b -- 0 
c -- 1 

Вы должны сортировать его, чтобы получить его так, как вы хотите. Обратите внимание, что E не установлен, потому что : после E, который является последним символом.


Edit: Альтернативный метод:

использование malloc(strlen(optStr) * sizeof(validOpt)) создать option массив и заполнить его. В этом случае option имеет размер массива 8, ему нужен только размер массива 5. Он более эффективен.

typedef struct { 
    char ch; 
    int hasVal; 
} validOpt; 

int main() 
{ 
    char *optStr = "a:bc:D:E"; 

    //option's array size is always larger than optStr's size, so it's safe 
    validOpt *option = malloc(strlen(optStr) * sizeof(validOpt)); 

    int i, count = 0, len = strlen(optStr); 
    for (i = 0; i < len - 1; i++) 
    { 
     if (optStr[i] == ':') //ignore this character 
      continue; 
     option[count].hasVal = optStr[i + 1] == ':'; 
     option[count].ch = optStr[i]; 
     count++; 
    } 

    if (optStr[i] != ':') //handle the last character in optStr 
    { 
     option[count].hasVal = 0; 
     option[count].ch = optStr[i]; 
     count++; 
    } 

    for (i = 0; i < count; i++) 
     printf(" %c -- %d\n", option[i].ch, option[i].hasVal); 
    free(option); 
    return 0; 
} 

выход:

a -- 1 
b -- 0 
c -- 1 
D -- 1 
E -- 0 
+0

Большое спасибо Бармаку. Ценить это! Вы сэкономили много времени. Он работал отлично. Необходимо изучить больше программ, связанных с массивом и структурой. Дайте мне знать, если у вас есть хорошие ссылки. – mehtame026

+0

Нет проблем, мне было скучно, поэтому я добавил второй способ его решения. –

+0

Прохладный. Btw во втором подходе, если я хочу объявить массив строк и структур глобально, это может создать проблему времени компиляции. Это работает, только если я объявляю их локально. – mehtame026

1

Во-первых, в конце вашей основной, вы пытаетесь PRINTF i как char и option[...].hasVal как int, это не перевернутый?

Вместо этого *(optStr + i), do optStr[i]. Это ТОЧНО одно и то же и гораздо более читаемо.

Затем параметр представляет собой массив validOpt. Делая это:

option[*(optStr+i)] = 1; 

*(optStr+i) == optStr[i] это символ, так что это значение ASCII. Затем вы пытаетесь назначить validOpt равным 1. Вы не можете. Поскольку validOpt - это структура. Возможно, вы хотите сделать validOpt.hasValue = 1.

На самом деле, я не совсем понимаю, что вы хотите сделать здесь, если вы можете развить немного больше было бы здорово :)

+0

Спасибо @Ludonope. Я попытался изменить программу на основе ваших комментариев. Но я до сих пор не могу добиться своего результата. Я дал ожидаемый результат. Я просто хочу проанализировать строку и заполнить структурный массив на основе символов в этой строке. – mehtame026

 Смежные вопросы

  • Нет связанных вопросов^_^