c - 如何修复在句子数组中提取偶数索引值并将其与奇数索引值组合的代码?

标签 c arrays

基本上,我的代码应该通过取出所有偶数索引值(从 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;
}

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

成功结果:

Successful Result

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

Unsuccessful Result using the same entry

最佳答案

您可以采取稍微更短的方法,只需使用两个索引来构建您的加密字符串(如 evenstartoddstart),基于 的总长度用户输入的消息evenstart = 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'

检查一下,如果您有任何问题,请告诉我。

关于c - 如何修复在句子数组中提取偶数索引值并将其与奇数索引值组合的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55309144/

相关文章:

c - How to solve is 0 bytes after a block of size 6 alloc'd 解决办法

java - 如何打印四部分碎片列表中的数组列表?

c - 接受输入数组并输出指向数组中所有偶数的指针的函数

algorithm - 如何在常数时间内从给定的索引区间 (i, j) 中找到元素的总和?

c++ - BITMAPINFO 结构的 bmiColors 字段

c - stat(2) 和 EINTR

c - 当我试图在代码块编译器中运行这个程序时,strstr() 函数每次都返回 0。为什么?

c - 同时启动所有线程

C 中带堆栈的计算器段错误(核心已转储)

jquery - 使用 jQuery 获取选择器的 html 作为字符串