这是我的代码

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

#define MAKS_RIJECI 100
#define MAKS_DUZINA_RIJECI 50

char *ispremjestaj(char recenica[], int pozicije[], int brojPozicije) {
    static char rezultat[MAKS_DUZINA_RIJECI * MAKS_RIJECI];
    char *rijeci[MAKS_RIJECI];
    int brojac = 0;
    char *token = strtok(recenica, " ");
    while (token != NULL && brojac < MAKS_RIJECI) {
        rijeci[brojac++] = token;
        token = strtok(NULL, " ");
    }
    for (int i = 0; i < brojPozicije; i++) {
        int pozicija = pozicije[i] - 1;
        if (pozicija >= 0 && pozicija < brojac) {
            char *temp = rijeci[pozicija];
            for (int j = pozicija; j > 0; j--) {
                rijeci[j] = rijeci[j - 1];
            }
            rijeci[0] = temp;
        }
    }
    strcpy(rezultat, "");
    for (int i = 0; i < brojac; i++) {
        strcat(rezultat, rijeci[i]);
        strcat(rezultat, " ");
    }
    rezultat[strlen(rezultat) - 1] = '\0';
    return rezultat;
}

int main() {
    return 0;
}

当单词之间有一个很大的空格或句子末尾有一个空格时,它会删除它,我试图通过添加另一个if语句来解决这个问题,如果主句的结尾以空格结束,那么最后一句也应该是这样的,但它不起作用.还有一个错误,在这个例子中发生了这种情况,

结果:错误的结果 测试代码:

以下是main中的测试输入:

char text[] = "Introduction to programming is a new name for Basics of computer science";
int array[] = { 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 };
printf("'%s'\n", ispremjestaj(text, array, 20));
printf("'%s'", ispremjestaj(text, array, 21));

程序的输入/输出:

Expected output(s):

'Introduction to programming is a new name for Basics of computer science'
'to Introduction programming is a new name for Basics of computer science'

My program printed:

'Introduction to programming is a new name for Basics of computer science'
'Introduction'

执行时间(四舍五入):0秒

EDIT: 这是我的代码 modified by chqrlie's code.

但是,仅仅通过修改输入句子(recenica)而不使用另一个字符串(rezultat)就可以做到这一点吗?

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

#define MAKS_RIJECI 100

char *ispremjestaj(char recenica[], const int pozicije[], int brojPozicije) {
    const char *rijeci[MAKS_RIJECI];
    size_t duzine[MAKS_RIJECI];
    int brojac = 0;
    const char *p = recenica;
    for (brojac = 0; brojac < MAKS_RIJECI; brojac++) {
        p += strspn(p, " "); 
        if (*p == '\0')
            break;
        rijeci[brojac] = p;
        duzine[brojac] = strcspn(p, " ");
        p += duzine[brojac];
    }
    for(int i =0;i<brojPozicije;i++){
        int pozicija=pozicije[i]-1;
        if(pozicija>=0 && pozicija<brojac){
            const char *temp=rijeci[pozicija];
            int duzina=duzine[pozicija];
            for(int j=pozicija;j-- >0;){
                rijeci[j+1]=rijeci[j];
                duzine[j+1]=duzine[j];
            }
            rijeci[0]=temp;
            duzine[0]=duzina;
        }
    }
    char rezultat[100];
        char *q=rezultat;
        
        for(int i=0;i<brojac;i++){
            memcpy(q, rijeci[i], duzine[i]);
            q+=duzine[i];
            *q++=' ';}
            if(q>rezultat)
            --q;
            if(recenica [strlen(recenica)-1]==' ')
            *q++=' ';
            *q='\0';   

    
     strcpy(recenica, rezultat);

    return recenica;
    
}

int main() {
    return 0;
}

推荐答案

输出是不正确的,因为ispremjestaj函数修改了它的参数字符串,也就是说它使用strtok()将它分解为令牌. 第二个调用得到一个句子,其中只有第一个单词,因为空格已经被替换为空字节.

尚不清楚是否应该修改参数字符串或位置数组,或者是否应该为结果字符串分配空间以避免覆盖以前的结果.从讨论中可以看出,返回static数组的地址似乎是预期的行为,既可以保留参数字符串,又不会导致内存泄漏,但这是不好的做法,澄清会很有帮助.

您可以使用C库中的strspn()strcspn()来代替strtok(),它们使用相同的分隔符字符串,并测量字符串中匹配的字符数量(分别为不匹配)其中一个分隔符.

不清楚这个函数应该如何处理首字母、多个和尾随空格,所以我删除了首字母和尾随空格,并用单个空格替换了一系列空格(正如您所做的那样).

以下是修改后的版本:

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

#define MAX_WORDS 100
#define MAX_WORD_LENGTH 50

char *reorder(const char *sentence, const int positions[], int number_of_positions) {
    const char *words[MAX_WORDS];
    size_t lengths[MAX_WORDS];
    int counter = 0;
    const char *p = sentence;
    for (counter = 0; counter < MAX_WORDS; counter++) {
        p += strspn(p, " ");  /* skip blanks */
        if (*p == '\0')
            break;
        words[counter] = p;
        lengths[counter] = strcspn(p, " ");
        p += lengths[counter];
    }
    for (int i = 0; i < number_of_positions; i++) {
        int position = positions[i] - 1;
        if (position >= 0 && position < counter) {
            const char *word = words[position];
            size_t length = lengths[position];
            for (int j = position; j-- > 0;) {
                words[j + 1] = words[j];
                lengths[j + 1] = lengths[j];
            }
            words[0] = word;
            lengths[0] = length;
        }
    }
    char result[MAX_WORDS * MAX_WORD_LENGTH + 2];
    char *q = result;
    for (int i = 0; i < counter; i++) {
        memcpy(q, words[i], lengths[i]);
        q += lengths[i];
        *q++ = ' ';
    }
    if (q > result)
        --q;
    *q = '\0';
    return result;
}

int main(void) {
    char text[] = "Introduction to programming is a new name for Basics of computer science";
    int array[] = { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 };
    printf("'%s'\n", reorder(text, array, 20));
    printf("'%s'\n", reorder(text, array, 21));
    return 0;
}

C++相关问答推荐

有效地计算由一组点构成的等边三角形和等腰三角形的数量

sizeof结果是否依赖于字符串的声明?

标准的C17标准是用括号将参数包装在函数声明中吗

无法用C++编译我的单元测试

有没有可能我不能打印?(C,流程)

使用双指针动态分配和初始化2D数组

为什么指针运算会产生错误的结果?

有什么方法可以将字符串与我们 Select 的子字符串分开吗?喜欢:SIN(LOG(10))

ifdef __cplusplus中的整数文字单引号

在txt文件中找到指定的字符串,并从数字中减go 相同的值

Boyer Moore算法的简单版本中的未定义行为

在运行时判断C/C++指针是否指向只读内存(在Linux操作系统中)

用于计算位数和的递归C函数

GETS()在C++中重复它前面的行

有没有办法减少C语言中线程的堆大小?

赋值两侧的后置增量,字符指针

意外的C并集结果

我可以使用Windows SDK';s IN6_IS_ADDR_LOOPBACK等,尽管没有文档?

如何在C中计算包含递增和递减运算符的逻辑表达式?

与指针的原始C数组或C++向量<;向量<;双>>;