C字符串数组顺序操作

C字符串数组顺序操作,c,arrays,C,Arrays,我正在做一个C课程的练习,我遇到了一个分割错误。此代码用于更改数组的顺序。比如,输入:adbcdaa,输出:daacbad。它随空间变化。因此,我使用strtok将其转换为令牌,并使用for循环来更改顺序,但我得到了一个错误。我的问题是什么是分割错误:11,为什么我会得到一个 #include <stdio.h> #include <string.h> void changeorder(int SIZE, char string[], char changed_stri

我正在做一个C课程的练习,我遇到了一个分割错误。此代码用于更改数组的顺序。比如,输入:adbcdaa,输出:daacbad。它随空间变化。因此,我使用strtok将其转换为令牌,并使用for循环来更改顺序,但我得到了一个错误。我的问题是什么是分割错误:11,为什么我会得到一个

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

void changeorder(int SIZE, char string[], char changed_string[]);

int main() {
    const int SIZE = 10;
    char string[SIZE];
    char changed_string[SIZE];

    printf("Enter string: ");
    fgets(string, sizeof(string), stdin);
    strtok(string, " ");
    size_t len = strlen(string);
    if(string[len-1] == '\n') {
        string[len-1] = '\0';
    }
    changeorder(SIZE, string, changed_string);
}

void changeorder(int SIZE, char string[], char changed_string[]) {
    int i;
    int j;
    for(i=SIZE; i>0; i--) {
        for(j=0; j<SIZE; j--) {
            string[i] = changed_string[j];
        }
    }
}
#包括
#包括
无效更改顺序(整数大小,字符字符串[],字符更改的字符字符串[]);
int main(){
常数int SIZE=10;
字符字符串[大小];
字符更改_字符串[大小];
printf(“输入字符串:”);
fgets(字符串、sizeof(字符串)、stdin);
strtok(字符串“”);
尺寸长度=strlen(字符串);
如果(字符串[len-1]='\n'){
字符串[len-1]='\0';
}
更改顺序(大小、字符串、更改的字符串);
}
无效更改顺序(整数大小,字符字符串[],字符更改的字符字符串[]){
int i;
int j;
对于(i=SIZE;i>0;i--){
对于(j=0;j
#包括
#包括
无效更改顺序(大小、字符字符串[]、字符更改的字符字符串[]);
内部主(空){
常数int SIZE=16;
字符字符串[大小];
字符更改_字符串[大小];
printf(“输入字符串:”);
fgets(字符串、sizeof(字符串)、stdin);
strtok(字符串“\n”);
尺寸长度=strlen(字符串);
变更顺序(len、string、changed_string);
printf(“%s”\n”,已更改\u字符串);
返回0;
}
无效更改顺序(大小长度、字符字符串[]、字符更改字符串[]){
半焦温度[len];
int i=0,k=0;
而(len--){
如果(字符串[len]!='')
temp[k++]=字符串[len];
如果(字符串[len]=''||!len){
while(k)
更改的_字符串[i++]=temp[--k];
如果(字符串[len]='')
更改的_字符串[i++]='';
}
}
更改的_字符串[i]=0;
}

阅读strtok的文档,它不会神奇地“将其转换为令牌”。而您的示例是10个字符长,不适合
字符[10]
,您忘记了空终止符。关于这一行:fgets(string,sizeof(string),stdin);代码需要检查fgets()函数的返回值以确保sizeof(字符串)字节被读入字符串。(BTW:字符串是C++中的类的名称,因此可能不应该使用)一个问题是 AD B C DAA < /代码>使用10个字符,因此,您没有将数组的大小定为足以容纳数据和终止空值。这是好的,但这意味着你的数据将被截断9个字符。@ USER 3629 249:“代码>字符串是C++中的类名对C程序没有影响。你只是颠倒单词的顺序,还是按顺序排序?输入的输入和输出,要么是你正在做的,要么是BU。t排序需要两个循环(以及一些比较条目的代码),而简单的反转只需要一个循环。
#include <stdio.h>
#include <string.h>

void changeorder(size_t len, char string[], char changed_string[]);

int main(void) {
    const int SIZE = 16;
    char string[SIZE];
    char changed_string[SIZE];

    printf("Enter string : ");
    fgets(string, sizeof(string), stdin);
    strtok(string, "\n");
    size_t len = strlen(string);
    changeorder(len, string, changed_string);
    printf("'%s'\n", changed_string);
    return 0;
}

void changeorder(size_t len, char string[], char changed_string[]) {
    char temp[len];
    int i=0, k=0;
    while(len--){
        if(string[len] != ' ')
            temp[k++] = string[len];
        if(string[len] == ' ' || !len){
            while(k)
                changed_string[i++] = temp[--k];
            if(string[len] == ' ')
                changed_string[i++] = ' ';
        }
    }
    changed_string[i] = 0;
}