gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:41:00 24 4
gpt4 key购买 nike

我需要更改一个指定的字符,例如: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,只有当我输入放弃时,才返回整个单词。

最佳答案

除了并同意另一个答案之外,您还缺少一些基本知识。

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

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

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

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

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

使用常量可以避免不得不选择多个数组声明来更改它们的大小。顶部有一个方便的地方可以进行更改。

不要使用 gets ,对缓冲区溢出无能为力,已从C11中移除。使用 fgets .所有有效的面向行的输入函数(例如 fgets 和 POSIX getline )读取并包含尾随 '\n'在他们用输入填充的缓冲区中。因此,您需要从输入中修剪尾随换行符,否则您将得到 '\n'悬垂在您存储的任何字符串的末尾,这可能会导致比较等问题。只需获取长度并检查字符 length - 1验证它是 '\n' ,然后用 nul 终止字符覆盖它( '\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].codet并转到下一个字符。如果没有找到,您只需分配 s 中的字符。至 t .

注:不需要 table 的第五个元素(例如 '\0''\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()是类型 int并因此返回一个值(参见: C11 Standard §5.1.2.2.1 Program startup (draft n1570)。另请参见: See What should main() return in C and C++?),您可以执行类似于以下的操作:
#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编译字符串。 (添加 -pedantic 以获得更多警告)。对于 VS ( cl.exe onwindoze),添加 /Wall .对于 clang , 添加 -Weverything .阅读并理解每个警告。他们将识别任何问题,以及它们发生的确切线路。您可以通过聆听编译器告诉您的内容来尽可能多地了解编码,就像您从大多数教程中一样。

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

关于将 Char 更改为指定位置结构中的另一个指定 Char,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46438851/

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