2015-08-29 3 views
1

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

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

void Unos(char* string, int duzina) 
{ 
    int i=0; 
    char c; 
    do { 
     c=getchar(); 
     string[i]=c; 
     i++; 
    } while(c != '\n' && i<duzina); 
} 

int brojznak(char* str) 
{ 
    int i=0,br=0; 
    while(*str++ != '\0') 
    { 
     br++; 
    } 
    return br; 
} 

int main() 
{ 
    char recenica[100]; 
    printf("Unesite recenicu\n"); 

    Unos(recenica,100); 
    int i=0; 

    printf("%d",brojznak(recenica)); 
    return 0; 
} 

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

int brojznak(char* str) 
{ 
    int i=0,br=0; 
    while(*str++ != '\0') 
    { 
     br++; 
    } 
    return br; 
} 

Он снова иногда печатает несколько случайных символов, но отсчитывает это точно. Может ли кто-нибудь сказать мне, что не так в этом коде?

+0

Это даже не компилируется из-за этого: 'Е ("% D", brojznak (recenica)); ' –

+1

Каков правильный результат для этого кода, который вы хотите? –

+2

И ты сказал: «С другой стороны, если мы изменим условие». Нет никакой разницы между первой и второй реализацией 'brojznak()' вы отправили. –

ответ

2

Окончание строки отсутствует в Unos().

while(*str++ != '\0') in brojznak() не знает, когда остановиться.

void Unos(char* string, int duzina) { 
    int i=0; 
    char c; 
    do { 
    c = getchar(); 
    string[i] = c; 
    i++; 
    } while(c != '\n' && (i + 1) <duzina); // Insure enough room 
    string[i]='\0'; // add this 
} 

Некоторые другие изыски:

void Unos2(char* string, size_t duzina) { 
    size_t i = 0; 
    while ((i+1) < duzina) { Only attempt to read if space allows it. 
    int c = getchar(); // Use int to distinguish EOF from characters 
    if (c == EOF) break; 
    string[i] = c; 
    i++; 
    if (c == '\n') break; 
    } 
    string[i] = '\0'; // add this 
} 
+0

Да. Определенно завершение строки. –

0

попробовать этот

for(i=0; getchar()!='\n'; ++i) 
     ; 
+0

«Если поток находится в конце файла, индикатор конца файла для потока установлен и' getchar' возвращает 'EOF'." Разумеется, код этого ответа будет цикл без конца. – chux

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