Когда я сохраняю код в функциях 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) ^