2016-01-27 3 views
1

Я пытаюсь получить первое значение пустого инициализированного массива string.I пробовал каждый метод, о котором я могу думать без везения. Я получаю предупреждение, ошибки или ошибку сегментации. Каков правильный способ печати нулевого значения и использовать его в инструкции if? Как только я получу это, я хотел бы получить это для цикла в конце печати строк, не равных нулю.получение первого значения пустого инициализированного массива строк

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

int main(int argc, char** argv) 
{ 
    char *strings_line_tokens[503] = {0}; 
    int i = 0; 

    strings_line_tokens[0] = malloc(strlen("cookies")+1); 
    strcpy(strings_line_tokens[0], "cookies"); 

    strings_line_tokens[2] = malloc(strlen("FOOBAR")+1); 
    strcpy(strings_line_tokens[2], "FOOBAR"); 

    printf("strings_line_tokens[]: %s\n",strings_line_tokens[0]); 
    printf("-------------------\n"); 

    printf("strings_line_tokens[]: %c %d \n",(char)strings_line_tokens[1], (int)strings_line_tokens[1]); 
    printf("aaaaaaaaaaaaaaaa\n"); 

    printf("strings_line_tokens[]: %c %d \n",strings_line_tokens[1], strings_line_tokens[1]); 
    printf("bbbbbbbbbbbbbbbb\n"); 

    printf("strings_line_tokens[]: %c %d \n",(char)strings_line_tokens[1][0], (int)strings_line_tokens[1][0]); 
    printf("ccccccccccccccccccc\n"); 

    printf("strings_line_tokens[]: %c %d \n",strings_line_tokens[1][0], strings_line_tokens[1][0]); 
    printf("-------------------\n"); 

    if(strings_line_tokens[1] == 0) 
     printf("You have a NULL \n"); 

    for(i = 0; i < 3; i++) 
     if(strings_line_tokens[i] != 0) 
      printf("strings_line_tokens[]: %s\n",strings_line_tokens[i]); 
    return 0; 
} 

Вот текущие предупреждения, которые я получаю.

main.c:13: warning: cast from pointer to integer of different size 
main.c:13: warning: cast from pointer to integer of different size 
main.c:15: warning: format ‘%c’ expects type ‘int’, but argument 2 has type ‘char *’ 
main.c:15: warning: format ‘%d’ expects type ‘int’, but argument 3 has type ‘char *’ 

Вот обновление, на которое просил М. М.. Klas Lindbäck показал, как получить мою конечную цель, которая была для цикла.

Из прошлого опыта при использовании массива символов, который был инициализирован с null% с получением бы мусора в Е() и% D дало бы значение ASCII из null, который находится в Printf 0(). Так я думал, что один из них будет давать мусор и значение ASCii 0.

printf("strings_line_tokens[]: %c %d \n",(char)strings_line_tokens[1], (int)strings_line_tokens[1]); 
printf("aaaaaaaaaaaaaaaa\n"); 

printf("strings_line_tokens[]: %c %d \n",strings_line_tokens[1], strings_line_tokens[1]); 
printf("bbbbbbbbbbbbbbbb\n"); 

printf("strings_line_tokens[]: %c %d \n",(char)strings_line_tokens[1][0], (int)strings_line_tokens[1][0]); 
printf("ccccccccccccccccccc\n"); 

printf("strings_line_tokens[]: %c %d \n",strings_line_tokens[1][0], strings_line_tokens[1][0]); 
printf("-------------------\n"); 

Выход я надеялся с одним из них.

garbage 0 
+0

Что вы пытаетесь сделать? Кроме того, вы очень часто повторяетесь. Рассмотрим рефакторинг для большего количества функций. Почему вы снова и снова печатаете строки одного символа? – AustinWBryan

+0

В вашем коде есть 2 ошибки. 'int i = 0' missing'; 'и вы заканчиваете блок вашего цикла с помощью' {'вместо'} ' – Flikk

+0

strings_line_tokens [1] имеет тип char *, поэтому приведение к char или int здесь не имеет смысла. Единственное, что должно работать как ожидалось, это последний и второй для последнего printf с использованием strings_line_tokens [1] [0], который имеет тип char. – Georg

ответ

2

Цилиндр for уже работает.

Я удалил код проб и ошибки и сохранил только for цикла:

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

int main(int argc, char** argv) 
{ 
    char *strings_line_tokens[503] = {0}; 
    int i = 0; 

    strings_line_tokens[0] = malloc(strlen("cookies")+1); 
    strcpy(strings_line_tokens[0], "cookies"); 

    strings_line_tokens[2] = malloc(strlen("FOOBAR")+1); 
    strcpy(strings_line_tokens[2], "FOOBAR"); 

    for(i = 0; i < 3; i++) 
     if(strings_line_tokens[i] != 0) 
      printf("strings_line_tokens[%d]: %s\n", i,strings_line_tokens[i]); 
    return 0; 
} 

Выход:

strings_line_tokens[0]: cookies 
strings_line_tokens[2]: FOOBAR 

Там нет правильного способа печати нулевого значения. Я бы просто добавить предложение еще что напечатанный, что я хотел, например, строку null:

for(i = 0; i < 3; i++) 
    printf("strings_line_tokens[%d]: %s\n", i, strings_line_tokens[i] == 0 ? "null": strings_line_tokens[i]); 

или (если вы предпочитаете регулярные if над тройным если):

for(i = 0; i < 3; i++) 
    if (strings_line_tokens[i] == 0) { 
     printf("strings_line_tokens[%d]: %s\n", i, "null"); 
    } else { 
     printf("strings_line_tokens[%d]: %s\n", i, strings_line_tokens[i]); 
    } 

Новый выход:

strings_line_tokens[0]: cookies 
strings_line_tokens[1]: null 
strings_line_tokens[2]: FOOBAR 
+0

Не могли бы вы напомнить мне, что означает сокращение, если другое обозначение означает? Я не видел этого некоторое время. – rockstar797

+0

@ rockstar797 Добавлен регулярный эквивалент 'if'. –

+0

Благодарим за обновление. – rockstar797

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