Ошибка сегментации в программе поиска строки - PullRequest
0 голосов
/ 10 февраля 2020

Q. Введите и сохраните n строк и затем найдите конкретную строку .

Я могу ввести «Количество строк», а затем я также могу ввести строки. Но тогда строки не будут напечатаны. Ни сравнение, ни поиск не происходят, и это показывает ошибку сегментации. Это происходит, когда я использую gets () для ввода строк. Но когда я использую scanf () для ввода строк, программа завершает работу сразу после ввода «Количество строк». Почему так?

Вот код:

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

int main()
{
  char str[200],names[100];
  int n,i;
  int flag=0;

  printf("Give number of strings:\n");
  scanf("%d",&n);

  printf("Enter the strings:\n");
  for(i=0;i<n;i++)
  {
    gets(names);  
  }

  printf("Entered Values are:\n");
  for(i=0;i<n;i++)
  {
    printf("%s\t",names[i]);
  }

  printf("Enter the string you want to search for:\n");
  scanf("%s",str);
  for(i=0;i<n;i++)
  {
    if(strcmp(names[i],str) == 0)
       {
      flag=1;
      break;
       }
  }
  if(flag==1)
    printf("Yes this string %s exists!\n",str);
  else
    printf("No it does not exists");


  return 0;
}

1 Ответ

0 голосов
/ 11 февраля 2020
  1. gets Функция опасна, избегайте ее.
  2. Вам необходимо понять, как строки хранятся в памяти.
char c[] = "Hello";` //is same as 
char c[5];
c[0] = 'H';
c[1] = 'e';
c[2] = 'l';
c[3] = 'l';
c[4] = '0';
c[5] = '/0';

В своем фрагменте вместо выделения разных массивов для хранения входных строк вы перезаписываете один и тот же массив снова и снова.

Чтобы хранить n строки, вам нужно выделить n символьных массивов. VLA можно использовать для выделения 2D-массива, например char names[n][100] размера nX100. names[0...n] представляет строку в 2D матрице, и каждая строка может хранить строки длиной 100 байт.

Обновите ваш код, как показано ниже,

char names[n][100];
printf("Enter the strings:\n");
for(i=0;i<n;i++)
{
   scanf("%99s",names[i]); //Avoid buffer overflow and mention max capacity
}

Вы можете найти полный код здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...