当前位置: 首页 > 知识库问答 >
问题:

strcpy(char*,chara[])给出的输出不正确。(逐字颠倒字符串)

汪栋
2023-03-14

我想达到的目标是-

输入:(假定为字符串文字。)< code >这是一个字符串

输出:字符串 a 是这个

我天真的解决方案:

>

  • 将字符串文本复制到char数组
    char数组str[sizeofstring]的当前内容:这是一个字符串

    逐字反转数组并将其存储在另一个数组中
    char reverse[sizeofstring]:sihT si a gnirts

    从最后一个位置反向遍历数组到第0个位置。将其存储在char数组解决方案中。
    char解决方案[sizeofstring]:string a is this

    strcpy(pointertoachar, solution)。- 因为函数需要返回指向字符的指针。

    代码:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    char *reverse(char *input) {
        int n = strlen(input);
        char str[n];
    
        char reverse[n];
        char solution[n];
    
        char *solutionp = malloc(sizeof(char) * n);
        strcpy(str, input);
    
        int last = 0;
        int i = 0;
        int q = 0;
    
        while (str[i] != '\0') {
            if (str[i] == ' ') {
                printf("i : %d\n", i);
                printf("LAST:%d\n", last);
                for (int t = (i - 1); t >= last; t--) { 
                    reverse[q] = str[t];
                    q++;
                }
                last = i + 1;
                reverse[q] = ' ';
                q++;
            }
            i++;
        }
    
        // for the last word.
        for (int cc = i - 1; cc >= last; cc--) {
            reverse[q] = str[cc];
            q++;
        }
    
        // Traversing from the last index to the first.
        int ii;
        int bb = 0;
        for (ii = n - 1; ii >= 0; ii--) {
            solution[bb] = reverse[ii];
            bb++;
        }
    
        // This prints the right output.
        // printf("%s\n",solution);
    
        // Copying from a char array to pointer pointing to a char array.
        strcpy(solutionp, solution);
    
        return solutionp;
    }
    
    int main() {
        char *str = "This is a string";
        char *answer;
    
        answer = reverse(str);
        printf("%s\n", answer);
    
        printf("\n");
    
        return 0;
    }
    

    问题:

    步骤1到3按预期工作。出于调试目的,我尝试打印包含解决方案的数组的输出,并且它工作正常,但是当我使用< code>strcpy将它复制到由指针指向的char数组并返回指针时,它打印垃圾值以及部分正确的输出。< br >

    输出:
    字符串a是This??Z

    第4步似乎有些问题。我做错了什么?

  • 共有1个答案

    方浩旷
    2023-03-14

    代码中的主要问题是您将临时缓冲区分配得太短了一个字节。您必须为字符串末尾的最后一个'\0'字节腾出足够的空间。

    您可以通过使用辅助函数以相反的顺序复制块来简化代码:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    char *reverse_block(char *dest, const char *src, int len) {
        for (int i = 0; i < len; i++) {
            dest[i] = src[len - i - 1];
        }
        dest[len] = '\0';
        return dest;
    }
    
    char *reverse_words(const char *string) {
        int i, last;
        int len = strlen(string);
        char temp[len + 1];
    
        for (i = last = 0; i < len; i++) {
            if (string[i] == ' ') {
                // copy the word in reverse
                reverse_block(temp + last, string + last, i - last);
                temp[i] = ' ';
                last = i + 1;
            }
        }
    
        // copy the last word in reverse
        reverse_block(temp + last, string + last, len - last);
    
        // allocate an array, reverse the temp array into it and return it.
        return reverse_block(malloc(len + 1), temp, len);
    }
    
    int main(void) {
        const char *string = "This is a string";
    
        printf("%s\n", string);
    
        char *solution = reverse_words(string);
        printf("%s\n", solution);
    
        free(solution);
    
        return 0;
    }
    

    现在,您可以通过实现一个就地反转块的函数来进一步改进代码。有了这个,你不再需要临时缓冲区,你可以直接处理字符串副本,它简化了代码。

     类似资料:
    • 问题内容: 最好使用内置的“ go”软件包及其一些子软件包(“ go / ast”,“ go / token”,“ go / printer”等)编写输出有效的go代码的go应用程序。 要创建字符串文字表达式,您需要创建一个ast.BasicLit: 在我的go程序中,我有一个字符串,我需要创建一个ast.BasicLit,该ast.BasicLit在输出时将生成一个字符串文字,该文字将忠实地再现

    • 本文向大家介绍C#中倒序输出字符串的方法示例,包括了C#中倒序输出字符串的方法示例的使用技巧和注意事项,需要的朋友参考一下 前言 本文将演示如何将字符串的单词倒序输出。注意:在这里我不是要将“John” 这样的字符串倒序为成“nhoJ”。这是不一样的,因为它完全倒序了整个字符串。而以下代码将教你如何将“你 好 我是 缇娜”倒序输出为“缇娜 是 我 好 你”。所以,字符串的最后一个词成了第一个词,而

    • 我是C#的新手,我有一些Java方面的基础知识,但我不能让这段代码正常运行。 它只是一个基本的计算器,但当我运行程序时,VS2008给了我这个错误: 我做了几乎相同的程序,但在Java使用的是JSwing,它运行得非常好。 下面是C#的形式: 会有什么问题?有没有办法解决? PS:我也试过 但没有奏效。

    • 《 C++ cout.put()》一节中,讲解了 ostream 类提供的 put() 成员方法的用法,其用于向输出流缓冲区中添加要输出的单个字符。而在某些场景中,我们还需要输出指定的字符串,这时可以使用 ostream 类提供的 write() 成员方法。 write() 成员方法专用于向输出流缓冲区中添加指定的字符串,初学者可以简单的理解为输出指定的字符串。其语法格式如下: ostream&w

    • 本文向大家介绍java输入数字,输出倒序的实例,包括了java输入数字,输出倒序的实例的使用技巧和注意事项,需要的朋友参考一下 我就废话不多说了,大家还是直接看代码吧~ 控制台效果显示: 补充知识:Java实现整数的逆序输出(三种方法) Java实现整数的逆序输出和C语言相似。下面我介绍三种方法。 第一种:无限制整数的逆序输出。 第二种:非负整数的逆序输出(结果String化)。 第三种:非特殊情

    • 主要内容:字符串的输出,字符串的输入其实在《 C语言输入输出》一章中我们已经提到了如何输入输出字符串,但是那个时候我们还没有讲解字符串,大家理解的可能不透彻,所以本节我们有必要再深入和细化一下。 字符串的输出 在C语言中,有两个函数可以在控制台(显示器)上输出字符串,它们分别是: puts():输出字符串并自动换行,该函数只能输出字符串。 printf():通过格式控制符输出字符串,不能自动换行。除了字符串,printf() 还能输