Ошибка ошибки сегментации при попытке завершить E1-19 из языка программирования C - PullRequest
0 голосов
/ 05 апреля 2019

В настоящее время я изучаю C и пытаюсь решить проблемы с языком программирования C, не зная, почему возникает эта ошибка. Вопрос:

Упражнение 1-19. Напишите функцию reverse (s), которая переворачивает строку символов s. Используйте его, чтобы написать программу, которая меняет свой ввод на строку за раз.

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

#include <stdio.h>

#define MAXLINE 1000

int getln(char line[], int limit);
void reverse (char line[]);

main(){
    int len;
    char line[MAXLINE];
    while ((len = getln(line, MAXLINE)) > 0){
      reverse(line);
      printf('%s',line);
    }
}

/*returns length of s*/
int getln(char s[], int lim){
  int c, i;
  for (i = 0; i < lim-1 && (c = getchar())!=EOF && c!='\n'; ++i)
    s[i] = c;
  if (c == '\n'){
    s[i] = c;
    ++i;
  }
  s[i] = '\0';
  return i;
}

void reverse(char s[]){
  int len, i;
  len = sizeof(s)/sizeof(s[0]);
  char temp[len];
  for (i = 0; i < len; ++i){
    temp[i] = s[len - i];
  }
  while ((s[i] = temp[i] != '\0'))
    ++i;
}

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

Спасибо!

1 Ответ

0 голосов
/ 05 апреля 2019

отправленный код не компилируется!

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

Для gcc при минимальном использовании:

-Wall -Wextra -Wconverson -pedantic -std=gnu11

Примечание: другие компиляторы используют разные опции для получения одинакового вывода.

Компиляция размещенного кода приводит к:

gcc   -Wall -Wextra -Wconversion -pedantic -std=gnu11 -c "untitled.c" 

untitled.c:8:1: warning: return type defaults to ‘int’ [-Wimplicit-int]
 main(){
 ^~~~

untitled.c: In function ‘main’:

untitled.c:13:14: warning: multi-character character constant [-Wmultichar]
       printf('%s',line);
              ^~~~

untitled.c:13:14: warning: passing argument 1 of ‘printf’ makes pointer from integer without a cast [-Wint-conversion]

In file included from untitled.c:1:0:
/usr/include/stdio.h:318:12: note: expected ‘const char * restrict’ but argument is of type ‘int’
 extern int printf (const char *__restrict __format, ...);
            ^~~~~~

untitled.c: In function ‘getln’:

untitled.c:21:12: warning: conversion to ‘char’ from ‘int’ may alter its value [-Wconversion]
     s[i] = c;
            ^
untitled.c:23:12: warning: conversion to ‘char’ from ‘int’ may alter its value [-Wconversion]
     s[i] = c;
            ^

untitled.c: In function ‘reverse’:

untitled.c:32:15: warning: ‘sizeof’ on array function parameter ‘s’ will return size of ‘char *’ [-Wsizeof-array-argument]
   len = sizeof(s)/sizeof(s[0]);
               ^

untitled.c:30:19: note: declared here
 void reverse(char s[]){

Я бы также настоятельно рекомендовал использовать функцию библиотеки C: fgets () to read the line, then use the function: strspn () to replace the trailing newline with a NUL byte, then use strlen () `для получения количества символов в строке. Эти функции полностью описаны на страницах MAN

Примечание: это похоже на домашнее задание, поэтому я не собираюсь давать вам код для выполнения задачи, но вы должны быть в состоянии создать его самостоятельно.

В качестве отправной точки функция main() имеет две действительные подписи:

int main( int argc, char (argv[] )
int main( void )

Обратите внимание, что обе подписи имеют тип возврата int

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