首页 > 解决方案 > 如何修复在句子数组中提取偶数索引值并将其与奇数索引值组合的代码?

问题描述

基本上,我的代码应该通过取出所有偶数索引值(从 0 开始)和奇数索引值并将偶数索引值放在奇数索引值之前来加密句子(或单词)。例如,像 "test" (0)t(1)e(2)s(3)t 这样的单词应该打印为 (0)t(2)s(1)e(3)t 或 "tset"。不应该打印任何数字,我只是用它们来显示奇数和偶数索引值。我的代码有时会起作用,具体取决于它的运行位置。我似乎在代码块和我尝试过的在线编译器之间得到了不同的结果。我怀疑这种不一致必须归咎于一个更大的问题。谁能帮我看看我做错了什么,这样我才能最终理解并纠正我的错误?

我曾尝试使用一个计数器将偶数和奇数索引值输入到一个数组中,但我也遇到了错误,因此我决定将它们放入单独的数组中,然后strcat将它们组合起来。有没有办法让它与我在代码中显示的方法一起工作,或者我应该回到以前的方法?

#include <stdio.h>
#include <string.h>
#define SIZE 1000

int main()
{
    char message[SIZE];
    char even[SIZE];
    char odd[SIZE];
    int length,j=0;
    printf("Enter a word or sentence.\n");
    fgets(message,SIZE,stdin);

    printf("Your message is: %s\n",message);
    message[strcspn(message, "\n")] = 0;
    length=strlen(message);
    printf("The length of the message is: %d\n",length);
    for(int i=0;i<length;i+=2){

        even[i/2]=message[i];

       // printf("%c\n",even[i/2]);
    }

    for(int i=1;i<length;i+=2){
        odd[j]=message[i];
        j++;
    }
    printf("The even letters are: %s\n",even);
    printf("The odd letters are: %s\n",odd);

    strcat(even,odd);
    printf("%s",even);


/*printf("\nFInalyy.");
   for(i=0;i<=count;i++)
      for(j=i+1;j<=count;j++){
         if(strcmp(allmessages[i],allmessages[j])>0){
            strcpy(temp,allmessages[i]);
            strcpy(allmessages[i],allmessages[j]);
            strcpy(allmessages[j],temp);
         }
      }
   printf("The original messages in alphabetical order are: ");
   for(i=0;i<=count;i++)
      puts(allmessages[i]);*/
    return 0;
}

当我输入诸如“测试”或“句子”之类的词时,它可以完美运行。有时我输入诸如“这是一个测试句子”之类的句子,它会很好地工作,然后有一次它会打印出一些随机的垃圾字母以及加密的句子。我想知道如何解决这个问题,并了解为什么它在同一个条目上完美运行几次然后就停止了。我最近几次使用 https://www.onlinegdb.com/online_c_compiler对其进行了测试,所以我的结果就是基于此。

成功结果:

成功的结果

使用相同条目的不成功结果:

使用相同条目的不成功结果

标签: carrays

解决方案


您可以通过简单地使用两个索引来构建基于用户输入的总长度的加密字符串(如evenstart和)来采取稍微短一些的方法。和oddstartmessageevenstart = 0;oddstart = (msglen + 1) / 2;

然后只需遍历用户输入的消息中的字符,在 处写入偶数字符,在 处写入encrypt[evenstart++]奇数字符encrypt[oddstart++]。(如果您将其用作字符串用于输出目的,请不要忘记使用nul-terminate 。 encrypt

把它放在一起你可以做:

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

#define MAXC 1024

int main (void) {

    char message[MAXC],
        encrypt[MAXC];
    size_t len, evenstart = 0, oddstart;

    fputs ("enter message: ", stdout);
    if (!fgets (message, MAXC, stdin)) {    /* validate message entered */
        fputs ("(user canceled input)\n", stdout);
        return 1;
    }

    message[(len = strcspn(message, "\r\n"))] = 0;  /* trim '\n', get len */
    oddstart = (len + 1) / 2;       /* get oddstart (add 1 before divide) */

    for (size_t i = 0; i < len; i++)        /* loop over each char */
        if (i & 1)      /* if odd, write char at oddstart */
            encrypt[oddstart++] = message[i];
        else            /* if even, write at evenstart */
            encrypt[evenstart++] = message[i];
    encrypt[len] = 0;   /* nul-terminate */

    printf ("message : '%s'\nencrypt : '%s'\n", message, encrypt);
}

注意:如果你愿意,你可以使用i % 2检查偶数/奇数,或者简单地i & 1- 在二进制中,如果个位是1奇数,否则它是偶数 - 由你决定)

示例使用/输出

$ ./bin/encrevenodd
enter message: tes
message : 'tes'
encrypt : 'tse'

$ ./bin/encrevenodd
enter message: test
message : 'test'
encrypt : 'tset'

$ ./bin/encrevenodd
enter message: tests
message : 'tests'
encrypt : 'tsset'

$ ./bin/encrevenodd
enter message: my dog has fleas
message : 'my dog has fleas'
encrypt : 'm o a laydghsfes'

看看事情,如果你有问题,请告诉我。


推荐阅读