Ошибка сегментации при преобразовании строки в целое число с помощью функции atoi - PullRequest
0 голосов
/ 06 мая 2020

Пока я пытаюсь преобразовать строку в целое число с помощью функции atoi, я не получаю никакого вывода. После отладки отображается ошибка ошибки сегментации в строке t=atoi(s[i]); Вот код для справки:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
  char s[100];
  int i=0,t;
  printf("Enter: ");
  fgets(s,100,stdin);
  while(s[i]!='\0')
  {
    if(s[i]>='1' && s[i]<='9')
    {
      t = atoi(s[i]);
      printf("%d\n",t);
    }
    i++;
  }
  return 0;
}

1 Ответ

0 голосов
/ 06 мая 2020

при компиляции всегда включайте предупреждения, а затем исправляйте эти предупреждения:

Выполнение опубликованного кода через компилятор gcc приводит к:

gcc   -O1  -ggdb -Wall -Wextra -Wconversion -pedantic -std=gnu11  -c "untitled2.c"  -I. (in directory: /home/richard/Documents/forum)

untitled2.c: In function ‘main’:

untitled2.c:14:16: warning: passing argument 1 of ‘atoi’ makes pointer from integer without a cast [-Wint-conversion]
       t = atoi(s[i]);
                ^

In file included from /usr/include/features.h:424:0,
                 from /usr/include/x86_64-linux-gnu/bits/libc-header-start.h:33,
                 from /usr/include/stdio.h:27,
                 from untitled2.c:1:

/usr/include/stdlib.h:361:1: note: expected ‘const char *’ but argument is of type ‘char’
 __NTH (atoi (const char *__nptr))
 ^

untitled2.c:9:3: warning: ignoring return value of ‘fgets’, declared with attribute warn_unused_result [-Wunused-result]
   fgets(s,100,stdin);
   ^~~~~~~~~~~~~~~~~~

Compilation finished successfully.

другими словами, этот оператор :

t = atoi(s[i]);

передает один символ в функцию: atoi() Но, atoi() ожидает передачи указателя на массив символов.

Со страницы MAN для atoi(), синтаксис:

int atoi(const char *nptr);

предлагает: заменить:

t = atoi(s[i]);
printf("%d\n",t);

на:

printf( "%d\n", s[i] );

При этом будет выведено значение ASCII каждого из символов в массиве s[]. Например, значение ASCII '1' равно 49.

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

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