2013-12-03 6 views
-1
#include<stdio.h> 
#include<conio.h> 
void main() 
{ 
    int str1[25]; 
    int i=0; 
    printf("Enter a string\n"); 
    gets(str1); 
    while(str1[i]!='\0') 
    { 
     i++; 
    } 
    printf("String Length %d",i); 
    getch(); 
    return 0; 
} 

Я всегда получаю строку длиной 33. Что не так с моим кодом.Найти длину строки без рекурсии в C

+0

'main()' возвращает 'int', вы странно иметь' return 0; ', но объявляете его как' void'. – unwind

+2

Здесь нет рекурсии, только итерация. – DarkDust

ответ

3

Это потому, что вы объявили ваш массив как тип int

int str1[25]; 

^^^-----------Change it to `char` 
+0

спасибо, что bro.its сейчас работает нормально –

+0

добро пожаловать! –

+0

@AjmalRasi: и всегда помните прототип основного int main (void) или int main (int argc, char * argv []) –

1

Вы не показываете пример своего ввода, но в целом я бы предположил, что вы страдаете от переполнения буфера из-за опасностей gets(). Эта функция устарела, а это значит, что никогда не будет использоваться во вновь написанном коде.

Использование fgets() вместо:

if(fgets(str1, sizeof str1, stdin) != NULL) 
{ 
    /* your code here */ 
} 

Кроме того, конечно, весь ваш цикл просто strlen(), но вы знали, что, верно?

EDIT: Gaah, полностью пропустил неправильное заявление, конечно, ваша строка должна быть char str1[25]; и не int.

0

Я хотел бы предложить некоторые изменения в свой код.

1) conio.h

This is not a header that is in use. So avoid using it. 

2) получает

gets is also not recommended by anyone. So avoid using it. Use fgets() instead 

3) INT str1 [25] Если вы хотите сохранить строку должно быть

 char str1[25]   
0

Проблема заключается в объявлении строки int str1[25]. Он должен быть char и не int

char str1[25] 
0
void main() //"void" should be "int" 
{ 
    int str1[25]; //"int" should be "char" 
    int i=0; 
    printf("Enter a string\n"); 
    gets(str1); 
    while(str1[i]!='\0') 
    { 
     i++; 
    } 
    printf("String Length %d",i); 
    getch(); 
    return 0; 
} 
1

Так много ответов уже сказал вам использовать char str1[25]; вместо int str1[25], но никто не объяснил, почему. Так вот:

A char имеет длину одного байта (по определению в стандарте C). Но int использует больше байтов (сколько зависит от архитектуры и компилятора, давайте предположим здесь 4). Так, если доступ индекса 2 в char массива, вы получаете 1 байт в памяти смещения 2, но если доступ к индексу 2 из int массива, вы получаете 4 байта в памяти смещения 8.

При вызове gets (который следует избегать, поскольку он неограничен и, следовательно, может переполнить ваш массив), строка копируется по адресу str1. Эта строка действительно представляет собой массив из char. Таким образом, для отображения строки будет 123 плюс завершение нулевого символа. Память будет выглядеть следующим образом:

Adress: 0 1 2 3 
Content: 0x31 0x32 0x33 0x00 

Когда вы читаете str1[0] вы получаете 4 байта на один раз, так str1[0] не возвращается 0x31, вы получите либо 0x00333231 (прямой порядок байт) или 0x31323300 (большие обратный порядок байт).

Доступ к str1[1] уже за пределами строки.

Теперь, почему вы получаете длину строки 33? Это на самом деле случайное, и вам «повезло», что программа не сработала. На начальном адресе str1 вы получаете значения int, пока не получите, наконец, четыре байта в строке. В вашей памяти есть какой-то случайный мусор, и по чистой случайности вы столкнулись с четырьмя 0 байтами после чтения 33 * 4 = 132 байта.

Здесь вы уже можете видеть, что оценки границ очень важны: ваш массив должен содержать 25 символов. Но gets уже может писать дальше (решение: вместо этого используйте fgets). Затем вы сканируете без ограничений и, таким образом, можете также получать доступ к памяти намного дальше вашего массива и, возможно, в конечном итоге можете работать в несуществующие области памяти (что приведет к сбою вашей программы). Решение для этого: делают проверки границ, например:

// "sizeof(str1)" only works correctly on real arrays here, 
// not on "char *" or something! 
int l; 
for (l = 0; l < sizeof(str1); ++l) { 
    if (str1[l] == '\0') { 
     // End of string 
     break; 
    } 
} 

if (l == sizeof(str1)) { 
    // Did not find a null byte in array! 
} else { 
    // l contains valid string length. 
} 
Смежные вопросы