将Char更改为指定位置结构中的另一个指定Char

时间:2017-09-27 03:05:41

标签: c arrays string pointers structure

我需要更改指定的字符,例如:字符串中的a-> z,d-> b。例如:输入被放弃;输出是zbznboneb。这是我的代码。

typedef struct {
    char source;
    char code;
} Rule;

void encodeChar (Rule table[5], char *s, char *t);

int main ()
{
    char s[80], t[80];
    Rule table[5] = { 'a', 'd', 'b', 'z', 'z', 'a', 'd', 'b', '\0', '\0'
    };

    printf ("Source string: \n");
    gets (s);
    encodeChar (table, s, t);
    printf ("Encoded string: %s\n", t);
    return 0;
}

void encodeChar (Rule table[5], char *s, char *t)
{
    int j = 0;

    while (s[j] != '\0') {
        if (s[j] == 'a')
            putchar ('d');
        if (s[j] == 'b')
            putchar ('z');
        if (s[j] == 'z')
            putchar ('a');
        j++;
    }
    return 0;
}

但是它给了我输出dz,但是当我输入废弃时它并没有返回整个单词。

2 个答案:

答案 0 :(得分:0)

如果您非常友好地解释在此代码中输出<{1}},az 以外的任何字符的位置:

d

请告诉我void encodeChar(Rule table[5], char *s, char *t) { int j =0; while(s[j] != '\0') { if (s[j] == 'a') putchar('d'); if (s[j] == 'b') putchar('z'); if (s[j]=='z') putchar('a'); j++; } return 0; } 除了putchar'a'或“'d'”之外的任何内容,你会得到一些强烈提示你问题的答案。

<强> P.S。最重要的是,如果我的相当受过教育的猜测是正确的,你需要预订!你没有安全地学习C语言。它不是理论上不可能的,但实际上不太可能你不会浪费大量的时间真正不稳定的代码

我推荐K&amp; R2E。它不是初学者友好,因为它假定你知道一些其他的编程概念,但是再一次,C不是初学者友好的语言,你不能只需将你的脸贴在键盘上即可获胜。

如果您正在寻找初学友好的内容,请选择其他语言。在我所知的情况下,C还没有任何初学者友好资源,或任何以初学者级别开始的知名教师。

如果您要使用C语言进行编程,则可以预期您能够阅读来自编译器的书籍,手册和错误消息以及 valgrind 都需要同样的关注您的代码需要的细节。

如果你没有书就能学会学习,你可能不得不忘掉。所以立即停止猜测,立即开始阅读,希望下次我收到你的消息时,这不是关于 basic 的解释

答案 1 :(得分:0)

除了并与其他答案一致之外,还有一些基本原则。

当您进入encodeChar时,您使用什么参数来告诉您table有多少元素? (你确实需要在table中针对每个字符检查table[i].source中的每个元素,以确定是否需要替换,对吗?)

注意: C通常将所有小写用于变量和函数名称,同时为常量和宏保留所有大写。 C避免使用 camelCase MixedCase 名称 - 留下C ++或java的名称。虽然这是一个风格问题,但它在很大程度上取决于你,它确实说明了你对C的欣赏,就像使用gets那样....

请勿在代码中使用幻数。如果您需要常量(例如80),请在代码顶部声明一个,例如

#define MAXC 80   /* maximum characters for input buffer */

如果要声明多个常量,则使用enum是一种有序的方式来声明全局常量。

使用常量可以防止必须通过多个数组声明来改变它们的大小。有一个方便的位置可以进行更改。

不要使用gets,它对缓冲区溢出无能为力,已从C11中删除。使用fgets。所有有效的面向行的输入函数(例如fgets和POSIX getline读取并包含缓冲区中的'\n'他们填写输入。因此,您需要从输入中修剪尾随换行符,或者您将'\n'悬挂在您存储的任何字符串的末尾,这可能会导致比较等问题。只需获取长度并检查字符{{1验证它是length - 1,然后只用 nul-terminatedating 字符('\n''\0'覆盖它们,它们是等价的)

这很简单,例如:

0

注意:使用len = strlen (s); /* get length of s */ if (len && s[len - 1] == '\n') /* check for \n */ s[--len] = 0; /* overwrite with \0 */ ,您现在可以在--len中保留新的长度。

最后,对于len函数,您需要知道encodechar有多少元素。对于table中的每个字符,如果找到匹配项,则会将其与每个s进行比较,然后您将table[i].source分配给table[i].code并转到下一个字符。如果找不到,您只需将t中的字符分配给s

注意:不需要t的第5个元素(例如table'\0'),您可以轻松 nul-terminate '\0'没有它 - 而且它不是替代品。

将它们放在一起,你可以写t类似于以下内容:

encodechar

完全放弃,并注意void encodechar (rule *table, size_t sz, char *s, char *t) { size_t i; while (*s) { /* for each character */ int replaced = 0; /* replaced flag */ for (i = 0; i < sz; i++) /* for each element of table */ if (*s == table[i].source) { /* is char == table[i].source */ *t = table[i].code; /* replace it */ replaced = 1; /* set replaced flag */ break; /* get next character */ } if (!replaced) /* if not replaced */ *t = *s; /* copy from s to t */ s++, t++; /* increment s and t */ } *t = 0; /* nul-terminate t */ } main()类型,因此返回一个值(请参阅:C11 Standard §5.1.2.2.1 Program startup (draft n1570)。另请参阅:See What should main() return in C and C++?),您可以执行类似的操作以下内容:

int

示例使用/输出

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

#define MAXC 80   /* maximum characters for input buffer */

typedef struct {
    char source;
    char code;
} rule;

void encodechar (rule *table, size_t sz, char *s, char *t);

int main (void) {

    char s[MAXC] = "", t[MAXC] = "";
    rule table[] = { {'a', 'd'}, {'b', 'z'}, {'z', 'a'}, {'d', 'b'} };
    size_t len = 0, n = sizeof table/sizeof *table;

    printf ("Source string : ");
    if (!fgets (s, MAXC, stdin)) {
        fprintf (stderr, "error: invalid input.\n");
        return 1;
    }

    len = strlen (s);                  /* get length of s   */
    if (len && s[len - 1] == '\n')     /* check for \n      */
        s[--len] = 0;                  /* overwrite with \0 */

    encodechar (table, n, s, t);

    printf ("Encoded string: %s\n", t);

    return 0;
}

void encodechar (rule *table, size_t sz, char *s, char *t)
{
    size_t i;

    while (*s) {                            /* for each character */
        int replaced = 0;                   /* replaced flag */
        for (i = 0; i < sz; i++)            /* for each element of table */
            if (*s == table[i].source) {    /* is char == table[i].source */
                *t = table[i].code;         /* replace it */
                replaced = 1;               /* set replaced flag */
                break;                      /* get next character */
            }
        if (!replaced)                      /* if not replaced */
            *t = *s;                        /* copy from s to t */
        s++, t++;                           /* increment s and t */
    }
    *t = 0;                                 /* nul-terminate t */
}

始终使用警告启用进行编译,接受代码,直到干净地编译而不发出警告。要启用警告,请将$ ./bin/encode Source string : abcdefghijklmnopqrstuvwxyz Encoded string: dzcbefghijklmnopqrstuvwxya 添加到-Wall -Wextra编译字符串中。 (添加gcc以获得其他几个警告)。对于 VS (windoze上的-pedantic),请添加cl.exe。对于/Wall,请添加clang。阅读并理解每个警告。他们将识别任何问题,以及它们发生的确切线。您可以通过简单地聆听编译器告诉您的内容,从大多数教程中学到很多关于编码的知识。

仔细看看,如果您有其他问题,请告诉我。