2015-10-02 2 views
0

Моя программа должна печатать каждый n-й символ в строке текста. Первый параметр определяет «n» или приращение между символами для отчета. Второй параметр является необязательным, но если указано, определяет, на сколько символов работать.Segfault при передаче большого параметра

#include <stdio.h> 
#include <stdlib.h> 
#define MAX_STR_LEN 100 

int main(int argc, char **argv) { 

    char string[MAX_STR_LEN]; 
    char *testval="This is a test, this is only a test. For the next sixty seconds, this will be a test of the emergency broadcasting system."; 

    if (argc<2) { 
      printf("Expected at least one argument.\n"); 
      return 1; 
    } 

    int inc=atoi(argv[1]); 

    if (inc <=0) { 
      printf("Expected first argument to be a positive number.\n"); 
      return 1; 
    } 

    int max=MAX_STR_LEN; 
    if (argc==3) { 
      max=atoi(argv[2]); 
      if (max<0) max=MAX_STR_LEN; 
    } 

    int i=0; 
    while(i < max) { 
      string[i]=testval[i]; // gdb says this is where the seg fault occurs 
      i++; 
    } 
    string[i]=0; 

    i=0; 
    while(string[i]!=0) { 
      printf("The %d char is %c\n",i,string[i]); 
      i = i + inc; 
    } 

    return 0; 
} 

Запуск "./prog3-40" отлично работает, но работает" ./prog3 5 150" вызывает ошибку сегм.

./prog3 5 150 
8 
Segmentation Fault 
+1

В чем Ваш вопрос? –

+0

Вы не можете скопировать строки с помощью оператора =. Вместо этого используйте strcpy(). – Abend

+2

Когда вы предоставляете 150 в качестве длины, вы пытаетесь получить доступ к данным за пределами границ, так что вам повезло, что вы получили крах, чтобы сказать, что делаете это неправильно. Если второй аргумент равен или больше MAX_STR_LEN, у вас есть проблемы; у вас также есть проблемы, если они длиннее, чем 'strlen (testval)'. И 150 длиннее обоих. –

ответ

0

Это будет работать лучше. вам нужно сделать строковый буфер достаточно большим, чтобы хранить все данные, которые вы вставляете в него. Ошибка сегментации, полученная вами, связана с записью на адрес памяти, который не разрешен для использования программой.

#include <stdio.h> 
#include <stdlib.h> 
#define MAX_STR_LEN 100 

int main(int argc, char **argv) { 

    char *testval="This is a test, this is only a test. For the next sixty seconds, this will be a test of the emergency broadcasting system."; 

    if (argc<2) { 
     printf("Expected at least one argument.\n"); 
     return 1; 
    } 

    int inc=atoi(argv[1]); 

    if (inc <=0) { 
     printf("Expected first argument to be a positive number.\n"); 
     return 1; 
    } 

    int max=MAX_STR_LEN; 
    if (argc==3) { 
     max=atoi(argv[2]); 
     if (max<0) max=MAX_STR_LEN; 
    } 

    char string[max]; 

    int i=0; 
    while(i < max) { 
     string[i]=testval[i]; 
     i++; 
    } 
    string[i]=0; 

    i=0; 
    while(string[i]!=0) { 
     printf("The %d char is %c\n",i,string[i]); 
     i = i + inc; 
    } 

    return 0; 
} 
Смежные вопросы