我需要更改指定的字符,例如:字符串中的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,但是当我输入废弃时它并没有返回整个单词。
答案 0 :(得分:0)
如果您非常友好地解释在此代码中输出<{1}},a
或z
以外的任何字符的位置:
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
。阅读并理解每个警告。他们将识别任何问题,以及它们发生的确切线。您可以通过简单地聆听编译器告诉您的内容,从大多数教程中学到很多关于编码的知识。
仔细看看,如果您有其他问题,请告诉我。