gpt4 book ai didi

c - 尝试反转字符数组

转载 作者:行者123 更新时间:2023-12-04 07:19:56 24 4
gpt4 key购买 nike

嗨,我是 C 编程的新手。我目前正在为为什么我的代码不起作用而苦苦挣扎。示例输入是“1234”。它应该输出 4321,但它不输出。无论如何,这是我的代码,我相信你们中的一个人可以回答为什么它不起作用。

int task4(void) {
printf("\nPlease enter a four digit number:\n");
char input[4];
char revInput[4];
scanf("%s", &input);
int i = 4;
int k = 0;
while (i>0) {
revInput[k] = input[i];
i--;
k++;
}
k++;
revInput[k] = '\0';
printf("Reversed: %s\n", revInput);
}

最佳答案

您的代码中有几个问题需要解决,让我们按顺序解决它们:

  • 首先scanf%s说明符是一个危险的命题,因为它很容易导致缓冲区溢出,从而导致未定义的行为。
  • 请记住,4 个字符的字符串将需要一个大小为 5 的数组,因为它需要为空字节提供空间。
  • 然后,如果您反转到该点,您还反转了原始缓冲区末尾的空字节,这意味着它将被放置在目标缓冲区的开头并使其成为空字符串,直到 printf被关注到。
  • 最后,while 循环必须允许 i前往 0 , 否则 revInput[0]不会被填满。

  • 所以更正你的代码,它看起来像这样:
    Live demo
    #include <stdio.h>
    #include <string.h>

    #define SIZE 5

    int main(void) {

    printf("\nPlease enter a four digit number:\n");

    char input[SIZE];
    char revInput[SIZE];

    scanf("%4s", input); // %4s specifier will only parse 4 chars and add
    // the null byte as the 5th

    int i = SIZE - 2; // i will go from 3 to 0, the null byte at index 4 will
    // not be reversed
    int k = 0;
    while (i >= 0) {
    revInput[k] = input[i];
    i--;
    k++;
    }
    k++;
    revInput[k - 1] = '\0'; // -1 because of k's last increment
    printf("Reversed: %s\n", revInput);
    }
    例如,如果您想要一个更强大的解决方案,您不知道输入的确切大小,则可以对代码进行小幅调整以使其适应可变大小的输入:
    Live demo
    int main(void) {

    printf("\nPlease enter a four digit number:\n");

    char input[SIZE];
    char revInput[SIZE] = {0}; // zero out the dest array

    scanf("%4s", input);

    int i = strlen(input); // i at last index of input, the null byte
    int k = 0;

    while (i-- >= 0) {
    revInput[k++] = input[i];
    }
    printf("Reversed: %s\n", revInput);
    }
    您可以使用的最后一个技巧是直接从 scanf 获取字符串的长度。无需 strlen :
    Live demo
    #include <stdio.h>

    #define SIZE 5

    int main(void) {
    printf("\nPlease enter a four digit number:\n");

    char input[SIZE];
    char revInput[SIZE] = {0}; // zero out the dest array

    int i;
    int k = 0;

    // lets add a condition to make sure scanf is successful
    if (scanf("%4s%n", input, &i) > 0) {
    while (--i >= 0) {
    revInput[k++] = input[i];
    }
    printf("Reversed: %s\n", revInput);
    }
    }

    关于c - 尝试反转字符数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68564699/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com