gpt4 book ai didi

关于查找表和数组[char a]含义的C编程问题

转载 作者:行者123 更新时间:2023-11-30 19:50:38 25 4
gpt4 key购买 nike

我遇到了这个解决方案,但我不明白第 25 行的代码。有人可以向我逐行解释吗?另外,问题如下:

  1. 由于 c 是一个 char,s2lut[c] 会得到什么?
  2. 使用 s2lut[256] 有什么意义吗?如果我将 256 更改为 max(我定义为 100),我会得到不同的输出。

这是代码

#include<stdio.h>
#define max 100

int main() {
void squeeze(char s1[], char s2[]);
char s1[max] = "I am testing function that deletes character that matches characters in s2";
char s2[max] = "ac";
squeeze(s1, s2);
printf("After deleting the characters in s2: %s \n", s1);
return 0;
}

void squeeze(char s1[], char s2[]) {
if (!s1[0] || !s2[0])
return; /* Nothing to do if either string is empty */

char s2lut[256], c;
int i;
int ri; /* Index of s1 to read char from */
int wi; /* Index of s1 to write char to */

for (i = 0; i < 256; i++)
s2lut[i] = 0;

i = 0;
while (c = s2[i++])
s2lut[c] = 1;

ri = wi = 0;
while (s1[ri])
{
if (s2lut[s1[ri++]])
s1[wi] = s1[ri];
else
s1[++wi] = s1[ri];
}

s1[wi] = '\0';
}

最佳答案

I do not understand codes from line 25

我假设你问的是这个循环:

   while (c = s2[i++])
s2lut[c] = 1;

相当于:

c = s2[i++];
while (c != 0) {
s2lut[c] = 1;
c = s2[i++];
}

所以你看我们发生了两件事。表达式c = s2[i++]以及执行赋值在赋值后具有c的值。所以你将两个步骤合二为一。然后,您可以将任何非零整数视为 bool True,因此只要 c 为非零(即不是终止字符),循环就会继续。

我想如果您是初学者,这看起来有点疯狂,但对于 C 语言来说这是相当惯用的。

Is there any meaning of using s2lut[256]

在声明/定义中,它有一个明确的含义:请给我一个 256 个字符的数组。

在使用中,它没有有效的含义,因为数组的元素索引为0到255,并且不允许您请求元素索引256(可怕的未定义行为)。

I change the 256 to max(which I defined to be 100).

您的代码似乎是通过为每个可能的值分配一个标记并使用 s2 中看到的该字符的每个实例进行设置来生成目标字符的查找。

一般假设(如果我们诚实的话,这是完全公平但不正确)是一个字符将是一个字节(8 位)大小。因此,它可以具有 256 个可能值中的任何一个 (00000000 ... 01101101 ... 11111111)。瞧!我们需要 s2lut 中有 256 个条目(lut 可能代表“查找表”)。

如果您只将其设置为 100 个条目长,那么任何值为 100 或以上的字符都将被放入您不拥有的内存中,并且......未定义的行为!

关于关于查找表和数组[char a]含义的C编程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58770552/

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