- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要更改一个指定的字符,例如: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;
}
最佳答案
除了并同意另一个答案之外,您还缺少一些基本知识。
当您进入 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].code
至
t
并转到下一个字符。如果没有找到,您只需分配
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/
这个问题在这里已经有了答案: Why don't Java's +=, -=, *=, /= compound assignment operators require casting? (11 个
当我尝试运行以下代码时,List(.of) 无法编译并给出主题错误。 package collections; import java.util.LinkedHashSet; import java.
我正在尝试编译使用 ChatScript 库的程序。这是我在名为 main.cpp 的文件中的代码: #include #include "common.h" using namespace std
我想在我的程序中外部使用 ChatScript。在documents它说: Embedding Step #1 First, you will need to modify `common.h and
假设我有一个 char,我想用一行代码将其 strcat() 转换为 char 数组。对于 [一个非实用的] 示例: strcat("ljsdflusdfg",getchar()); 或者我想做相反的
我有以下类型签名: *Main Lib> let f :: a -> a -> a -> a; f = undefined *Main Lib> let x :: Char; x = undefin
我正在学习如何在 C 中使用指针(使用 malloc 和 free),但我在这个练习中遇到了一些麻烦。我只想制作一个指针数组,我想在其中保存每个单词的方向。然后我想为一个特定的词做一个 free(),
我有一个字符*: char* version = "10.5.108"; 我想通过字符分隔符获取两个新的 char*。 char delimiter = '.'; 执行以下代码后: printf("|
最近在学习Cpp,今天在学习使用Clion做测试的时候,发生了奇怪的事情。 这是我的代码 int main() { char c = 'b'; char carr[1]{'a'};
我对 c 很陌生,我正在审查一些代码。我遇到了这个: static char * fromDataType; static char * toDataType; static char * fromR
我有一个像这样的动态结构: struct network { int count; char** ips; } 如果我知道每个字符串数组都是 16 个字节(即 INET_ADDRSTR
我有一个旧程序,其中使用了一些库函数,但我没有那个库。 所以我正在使用 C++ 库编写该程序。在那个旧代码中有一些函数是这样调用的 *string = newstrdup("这里有一些字符串"); 字
我正在编写一个函数,该函数接受 ArrayList,然后将每个 char[] 复制到另一个增加长度的 char[] 中,然后将新的 char[] 添加到新的 ArrayList 中。当我尝试复制数组时
我正在寻找 map >并生成每个可能的 map从它。 我知道这可能会占用大量内存并需要一些时间。 每个map需要包含每个字母 a-z,并映射到唯一的 a-z 字符。 IE。啊bjcp迪EVfh嘎血红蛋
#define NAME_LEN 20 #include "stdio.h" #include "stdlib.h" #include "string.h" #pragma warning(disab
所以我必须创建一个函数来找到一对带有第一个字母并返回第二个字母的函数。 我实际上找到了一个答案,但是使用 map 功能却找不到。 lookUp :: Char -> [(Char, Cha
我最近接受采访并要求写mystrcat(*s1, *s2, *s3) 其中s1 和s2 是源字符串连接结果由 s3 给出。有人告诉我,不要担心 s3 的内存分配,并假设 s1 和 s2 不是空/无效字
今天我与一位同事讨论了他(对我来说)不寻常的“main”函数签名。他喜欢这样声明: int main(int argc, char* (*argv)[]) { printf("at index
这个问题在这里已经有了答案: 关闭 12 年前。 Possible Duplicate: What's the difference between new char[10] and new cha
通常字符串文字是 const char[] 类型。但是当我把它当作其他类型时,我得到了奇怪的结果。 unsigned char *a = "\355\1\23"; 使用此编译器会抛出警告“初始化中的指
我是一名优秀的程序员,十分优秀!