2016-03-15 3 views
0

Когда я добавляю цикл for, я получаю ошибку сегментации. Кроме того, когда я добавляю буфер [i]! = '\ 0' в условие цикла while, я получаю ошибку ошибки сегментации. Мне трудно понять, почему эта ошибка появляется. Благодарю.Сегментация Неисправность, когда я добавляю a для цикла

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

int main() 
{ 
    char buffer[2000] = "-rw-r--r-- 1 ftp ftp 614400 Oct 18 2006\r\n" 
    char String[2000]; 
    int i, j, k= 0; 
    int nextline= 0; 

    for(k = 0; k<strlen(buffer);k++) 
    { 
     while((buffer[i] != '\r' && buffer[i+1] != '\n')) 
     { 
      String[j] = buffer[i]; 
      i++; 
      j++; 
     } 

    } 
    printf("%s", String);    
} 
+4

Кажется, вы не инициализируете 'i' и' j' нигде перед их использованием. –

+2

Йоахим прав: «int i, j, k = 0» инициализирует только k до нуля. – jdarthenay

+1

Нет инициализации буфера после запятой. – Jiminion

ответ

1

Петля формы for(k=0; k < strlen(buffer); k++) { ... }, как правило, очень плохой код. Это O (n ²), что означает, что время цикла увеличивается квадрически с ростом n. Зачем? Каждый проходит через цикл, вызывается функция strlen, чтобы определить длину строки в buffer. Если строка длиной 1000 символов, каждый strlen внутренне петли 1000 раз, а сам он называется 1000 раз, для 1000000 итераций внутреннего цикла! Вместо этого длина строки должна вычисляться один раз, вне цикла. Например)

int buffer_len = strlen(buffer); 
for(k=0; k<buffer_len; k++) { ... } 

Вы можете также использовать char * как ваш индекс цикла, и цикл, пока вы не столкнетесь с нулевым символом:

for(char *c_ptr = buffer; *c_ptr != '\0'; *c_ptr++) { ... } 

Во всяком случае, для вашей проблемы, вы не нужна двойная петля:

for(k = 0; k < strlen(buffer); k++) 
{ 
    // ... 
    while(/* incorrect condition here */) { 
     // ... 
    } 
    // ... 
} 

Вышеупомянутое предлагает вам пройти через каждый символ в вашей строке, Затем, начиная с каждого из этих символов, выполните другой внутренний цикл. То, что вы вероятно хотите просто if() заявления:

for(k = 0; k < strlen(buffer); k++) 
{ 
    // ... 
    if(buffer[k] == '\r' && buffer[k+1] == '\n') { 
     // ... 
    } 
    // ... 
} 

Я оставлю вам бороться с тем, что идет в // ... комментариях, если что-нибудь. Вы узнаете больше, делая.

Как указывали другие, ваши i & j переменные остались неинициализированными. Прежде чем использовать их, вы захотите убедиться, что вы их правильно инициализировали. Вы выполнили инициализацию k до нуля, что фактически не нужно, поскольку цикл for(k=0; ... ; ...) уже инициализирует значение k.