Почему я получаю ошибку сегментации?Когда все функции остаются в основном, это работает - PullRequest
0 голосов
/ 15 февраля 2019

Когда я сохраняю код в функциях main, код работает, но при передаче char * другим функциям вне main я получаю ошибку сегментации.Пожалуйста, помогите!

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

void printArr(char *arr, int count) {

int x;
//print the sorted array:
for(x = 0; x < count; x++) {
    printf("%s\n",arr[x]);
}
}

void sortArr(char *arr, int count) {

// sort the array in descending alphabetical order
int x, y;
char* temp = "";
for (x = 0; x < count; x++) {
    for (y = x + 1; y < count; y++) {
        if (strcmp(arr[x],arr[y]) <= 0) {
                temp = arr[x];
                arr[x] = arr[y];
                arr[y] = temp;
            }
        }
}

printArr(arr, count);

}

Подобные функции не позволяют переносить символы * *

void tokenizeArr(char *string, char *arr, char *rest , int count) {

// tokenize the string
char* tok;

tok = strtok(string, rest);

int y = 0;

while (tok != NULL) {
        arr[y] = tok;
        tok = strtok(NULL, rest);
        y++;
}

sortArr(arr, count);

}

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

// if there are not 2 arguments, return 0
if (argc != 2) 
    return 0;

/* if string is NULL return 0 */
if (argv[1] == NULL)
    return 0;

/* loop through argv[1] to count how many words are in string */
int x;
int count = 0;


for(x = 0;x < strlen(argv[1]); x++) {

    if (x == 0) {
        if (!isalpha(argv[1][x])) {
            // leave alone
        }
    }

    // add count for word if string ends with a letter
    else if(x == strlen(argv[1])-1 && isalpha(argv[1][x])) {    
        count++;
        continue;
    }

    // add count for word if restricted character comes up and a letter is before it
    else if(!isalpha(argv[1][x]) && isalpha(argv[1][x-1])) {
        count++;
    }
}

// create character pointer to string
char* string = argv[1];

// create an array the size of count
char* arr[count];

//create restrictions:
char rest[] = " \t\n\r\v\f1234567890,.?!@#$%^&*()-_=+]}[{;:<>/~`'";

tokenizeArr(string, arr, rest, count);

return 0;
}

Что можно изменить в коде, чтобы обеспечить плавный переход от функции к функции?

Диагностика ошибок: pointersorter.c: В функции \ u2018sortArr \ u2019: pointersorter.c: 22: 4: предупреждение: передача аргумента 1 из \ u2018strlen \ u2019 делает указатель из целого числа без приведения [включен по умолчанию]

if (strcmp (arr [x], arr [y]) <= 0) {^ В файле, включенном из pointersorter.c: 3: 0: /usr/include/string.h:395:15: примечание: ожидаемый const char * \ u2019, но аргумент имеет тип extern size_t strlen (const char * __ s) ^ </p>

pointersorter.c: 22: 4: предупреждение: передача аргумента 1 из\ u2018strlen \ u2019 делает

указатель из целого числа без приведения [включен по умолчанию] if (strcmp (arr [x], arr [y]) <= 0) {^ </p>

в файлевключен из pointersorter.c: 3: 0: /usr/include/string.h:395:15: note: ожидается \ u2018const char * \ u2019, но аргумент имеет значениеpe \ u2018char \ u2019 extern size_t strlen (const char * __ s) ^

pointersorter.c: 22: 4: предупреждение: передача аргумента 1 из \ u2018__builtin_strcmp \ u2019 делает указатель из целого числа без приведения [включен по умолчанию] if (strcmp (arr [x], arr [y]) <= 0) {^ </p>

pointersorter.c: 22: 4: примечание: ожидается \ u2018const char * \ u2019, но аргумент имеет тип \u2018char \ u2019

pointersorter.c: 22: 4: предупреждение: передача аргумента 2 из \ u2018__builtin_strcmp \ u2019 делает указатель из целого числа без приведения [включено по умолчанию]

pointersorter.c: 22: 4: примечание: ожидаемый const char * \ u2019, но аргумент имеет тип \ u2018char \ u2019

pointersorter.c: 22: 4: предупреждение: передача аргумента 1 из \ u2018strlen \ u2019 составляет

указатель на целое число без приведения [включен по умолчанию] В файле, включенном из pointersorter.c: 3: 0: /usr/include/string.h:395:15: note: ожидается \ u2018const char * \ u2019, но аргументтипа \ u2018char \ extern size_t strlen (const char * __ s) ^

1 Ответ

0 голосов
/ 15 февраля 2019

Вы должны использовать char** для массива строк, и вы пытаетесь использовать char* для него.(Потому что char* это строка)

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