为什么会出现细分错误?当所有功能都保持在主要状态时,它就起作用了

时间:2019-02-15 03:40:56

标签: c

当我将代码保留在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);

}

像这样的功能不允许携带char *吗?

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:警告:传递\ u2018strlen \ u2019的参数1会使指针从整数开始而无需强制转换[默认启用]

if(strcmp(arr [x],arr [y])<= 0){     ^ 在pointersorter.c:3:0包含的文件中: /usr/include/string.h:395:15:注意:预期\ u2018const char * \ u2019但参数的类型为\ u2018char \ u2019  extern size_t strlen(const char * __ s)                ^

pointersorter.c:22:4:警告:传递\ u2018strlen \ u2019的参数1使

无整型整数指针(默认启用)     如果(strcmp(arr [x],arr [y])<= 0){     ^

在pointersorter.c:3:0包含的文件中: /usr/include/string.h:395:15:注意:预期\ u2018const char * \ u2019但参数的类型为\ u2018char \ u2019  extern size_t strlen(const char * __ s)                ^

pointersorter.c:22:4:警告:传递\ u2018__builtin_strcmp \ u2019的参数1使指针从整数开始而没有强制转换[默认启用]     如果(strcmp(arr [x],arr [y])<= 0){     ^

pointersorter.c:22:4:注意:预期\ u2018const char * \ u2019但参数的类型为\ u2018char \ u2019

pointersorter.c:22:4:警告:传递\ u2018__builtin_strcmp \ u2019的参数2会使指针从整数开始而无需强制转换[默认启用]

pointersorter.c:22:4:注意:预期\ u2018const char * \ u2019但参数的类型为\ u2018char \ u2019

pointersorter.c:22:4:警告:传递\ u2018strlen \ u2019的参数1使

无整型整数指针(默认启用) 在pointersorter.c:3:0包含的文件中: /usr/include/string.h:395:15:注意:预期\ u2018const char * \ u2019但参数的类型为\ u2018char \ u2019  extern size_t strlen(const char * __ s)                ^

1 个答案:

答案 0 :(得分:0)

您必须对字符串数组使用char**,然后尝试对它使用char*。 (因为char*是一个字符串)