2012-06-05 2 views
2

Это мой исходный код:Странные персонажи с

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

void main() 
{ 
    int broj_znakova,i=0; 
    char niz1[81],niz2[81]; 

    printf("Enter something, for end Ctrl/c \n\n"); 
    while(fgets(niz1,81,stdin)!=NULL) 
    { 
     continue; 
    } 
    printf("You just enter: %s \n",niz1); 
    printf("This string is long %d\n",(strlen(niz1)-1)); 
    strcpy(niz1,niz2); 
    printf("niz2 is %s\n",niz2); 
    if(strcmp(niz1,niz2)==0) 
    { 
     printf("niz1 and niz2 is same\n"); 
    } 
    else 
    { 
     printf("niz1 != niz2\n"); 
    } 
    while(niz1[i]!='\n') 
    { 
     if(niz1[i]==' ') 
     { 
      broj_znakova ++; 
      i=i+1; 
     } 
    } 
    printf("Spaces in string = %d\n",broj_znakova); 
} 

Когда я нажимаю Ctrl/с я получил кучу странных персонажей, кто-то может помочь ??? Я google что-то о промывке, но я новичок :)

+0

Ctrl + C обычно завершает ваш процесс; вы должны нажать Ctrl + D, чтобы закрыть stdin. – dasblinkenlight

+0

Я пытаюсь Ctrl + d и ничего не пытаюсь Ctrl + x nothin, но Crtl + c работает для меня, но у моего niz1 слишком много фиксированных символов. –

ответ

1

Содержимое niz2 не инициализировано. Это приведет к неопределенному поведению. Возможно, вы хотели скопировать niz1 на номер niz2. Если это так, то вам необходимо изменить параметры в вызове strcpy. С strcpy первым параметром является цель.

Обратите внимание, что переменная broj_znakova никогда не инициализируется.

+0

Ок, я заменяю это на strcpy, но мне нужно знать, почему мой niz1 хранит некоторые странные символы после Ctrl + c –

+0

@StefanCvetkovic: Я не могу воспроизвести печать странных символов. И (как указано в комментарии dasblinkenlight), последовательность ctrl + c убивает процесс, поэтому ничего не печатается, если я нажимаю эту комбинацию клавиш. –

0

C не «обнуляет» информацию в памяти (в общем случае), поэтому при распределении переменных вы получаете все, что есть в памяти в то время (независимо от того, является ли оно логически читаемым как слова или нет), если вы печатаете что без системы, зная, что это строка, тогда она будет печатать до тех пор, пока не встретит NULL завершающий символ, если его нет, он пытается распечатать все, что есть в памяти, и это порождает странные символы.

+0

Это то же самое время (fgets (niz1,81, stdin)! = NULL) и while (fgets (niz1,81, stdin)! = EOF) ??? –

+0

Очень похоже. NULL для строк и других потоков, в то время как EOF для конца файла, так что предполагается, что вы используете файл для получения вашей информации. Но по сути они одинаковы, но должны использоваться для разных ситуаций. – richardhsu

0

На этой линии

strcpy(niz1,niz2); 

Я считаю ваши параметры наоборот, она должна быть зЬгсру (niz2, niz1); Странные символы, которые вы видите, это потому, что niz2 [81] имеет выделенную память, но она не «заполнена». Таким образом, вы получаете любые «магические» данные, которые могут содержать распределение. То есть до тех пор, пока вы не поместите что-нибудь в него или не выполните memset и т. Д.

+0

Спасибо, я делаю это –