2015-02-21 2 views
0

В моем коде ниже:Как распечатать массив символов, используя указатель на этот массив

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

#define BLOCKSIZE 256; 

int main() 
{ 
char text[BLOCKSIZE]; 

char *new_line; 
new_line=strcpy(text,"hello"); 

int i; 
for(i=0;i<sizeof(text)/sizeof(char);i++) 
{ 
printf("%c",*(new_line+i)); 
} 

return 0; 

} 

Я пытаюсь напечатать строку «привет» на экране с помощью указателя, который указывает на адрес из текст массива символов. Но в моем коде я получаю строку hello, продолженную некоторыми значениями мусора, а затем приводит к сбросу ядра. Может ли кто-нибудь показать мне правильный путь? Благодаря enter image description here

+2

'символ * PTR = текст; while (* ptr) printf ("% c", * ptr ++); 'Ваш код пытается напечатать 256' char' of '" hello "', который длится всего 6 'char'. GTG – chux

+0

Спасибо, что делает (* ptr)? Какое состояние есть * ptr? – Arnold

+0

'* ptr' берет указатель' ptr' и читает то, на что указывает: некоторый 'char'. Значение этого 'char' проверяется в' while (* ptr) 'для истинности (это отличное от нуля)? Поэтому, если конец строки не достигнут ('' \ 0''), цикл while продолжается. – chux

ответ

1

for(i=0;i < sizeof(text)/sizeof(char);i++)

Размер text составляет 256 байт, как вы выделили 256 байт на него. sizeof(text)/sizeof(char) вернет значение, намного большее, чем размер «привет». Вот почему цикл печатает значения мусора после «привет». Вместо этого вы должны использовать i < strlen(text).

+0

Извините за отсутствие i <, сделал исправление. – Arnold

+0

спасибо, я получаю это сейчас – Arnold

+1

. Более лучший способ написать этот код предлагается chux в разделе комментариев по вашему вопросу. –

0

Вы печатаете все 256 символов вашего массива text. Вы только хотите перебрать до длины строки, например:

for(i = 0; i < strlen(text); i++) 
{ 
    ... 
} 
0

Как заявило @tourniquet_grab, код печатает после окончания "Hello"

код копирует "Hello" в обильный размере text[], но только первые 6 char (вплоть до нулевого символа завершения '\0'). Указатель, возвращаемый strcpy(), является адресом первого chartext. Оставшиеся 250 char из text не были инициализированы. Таким образом, следующие отпечатки "Hello", a '\0' и 250 штук барахла.

new_line = strcpy(text,"hello"); 
    for(i=0;i<sizeof(text)/sizeof(char);i++) { 
    printf("%c",*(new_line+i)); 
    } 

Более разумным, чтобы напечатать содержимое снабжать струной, тетивой и т.п. из new_line - только до, но не включая завершающий нулевой символ '\0'. Этот метод изменит указатель new_line.

new_line = strcpy(text,"hello"); 
    // Continue looping until \0 reached 
    while (*new_line) { 
    printf("%c", *new_line++); 
    } 

Незначительные пункты:

sizeof(char) является всегда 1. Редко полезно закодировать это. Во всяком случае, код sizeof(text)/sizeof(text[0]).

Вместо printf("%c",*new_line++);, можно использовать fputc(*new_line++, stdout) или другие 1 char функции, такие как putc()

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