2013-05-28 2 views
-3
int string_length(char str[]) 
{ 
int i; 
for(i=200; i>=0; i--) 
{ 
    //printf("%c \n",str[200]); 
    printf("%d",i); 
    if(str[i] !=NULL) 
{ 
    return(i); 
    } 
    } 
} 

Я хочу, чтобы вернуть правильный размер строки, если строка: EEE RRR: он должен вернуть 7, но это возвращение 200 всегдаотсчет длины строки с

+0

Неопределенное поведение для коротких строк. Почему вы считаете, что отсчет назад, начиная с 200, будет работать? –

+0

Если вы передадите строку длиной 7, что, где и зачем вам нужно 'str [200]' делать? – nos

+2

Должен быть тролль, конечно? –

ответ

0

Вы можете использовать это вместо. Это более простой

int string_length(char *str) 
{ 
    int i =0; 
    while(*str++) i++; 
    return i; 
} 

и вы можете использовать встроенную функцию strlen() из #include <string.h>

+0

string_length (NULL) и SIGSEGV – jacekmigacz

+4

@jacekmigacz даже 'strlen()' и 'strcmp()' from '#include ' не делает проверка указателя NULL. Он может сделать проверку вне функции. 'if (str) {len = string_length (str); } ' – MOHAMED

+0

MOHAMED: sure !, that was comment for user2426801, чтобы сообщить ему – jacekmigacz

2

Это потому, что данные за пределами границ строки вы передаете случаен, и в основном не '\0'.

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

И что не так с strlen?

0

Вставлять как можно ближе к исходному коду,

  • Эта функция подсчитывает от 0-до ... не 200-вниз.
  • Эта функция заканчивается, когда он находит строковое терминатор, а не NULL


int string_length(char str[]) 
{ 
    int i; 
    for(i=0; i<200; ++i) 
    { 
     printf("[%d] : %c \n", i, str[i]); 
     if(str[i] == '\0') 
     { 
      return(i); 
     } 
    } 
} 

Или, если вы хотите минималистский функцию:

int string_length(char* s) 
{ 
    return (*s)? string_length(s+1)+1 : 0; 
} 
+0

Что произойдет, если вы перейдете в строку длиной 201? Вы не обслуживаете каждый обратный путь. – RobbieE

+1

@RobbieE: Как я четко заявил, это было написано, чтобы максимально приблизиться к исходному коду плаката, включая его ограничения и выбор дизайна. – abelenky

+0

aberlenky ur код не работает, если есть пробел между двумя строками – kimchi

0

Почему вы начинаете с 200-го символа? У вас нет способа узнать, был ли этот адрес памяти выделен или нет. Вы рискуете сбой программы. В связи с этим вы не проверяете, является ли строка, переданная в вашу функцию действительной (проверьте, что она имеет ненулевой адрес)

Скорее начните с индекса 0 и начните свой путь вверх.

В c/C++ конец строки помечен символом '\ 0'. Попробуйте найти этот вместо NULL (если вы не определили NULL как «\ 0»)

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