这段代码在做啥。检查两个字符串的字谜
Posted
技术标签:
【中文标题】这段代码在做啥。检查两个字符串的字谜【英文标题】:What is this code doing. Check two strings for anagrams这段代码在做什么。检查两个字符串的字谜 【发布时间】:2021-06-04 15:53:12 【问题描述】:此代码检查两个字符串是否为一个字谜。你能解释一下它是如何工作的吗?
#include <stdio.h>
int t[256],i;
int main(int c)
for(;c+3;)
(i=getchar())>10?t[i]+=c:(c-=2);
for(i=257;--i&&!t[i-1];);
puts(i?"false":"true");
这是我在查看源代码时所理解的: 它维护一个数组 t[],并将值存储在 index = 字符的 ascii 值。第一个字符串的字符存储的值为 1,第二个字符串的字符存储的值为 -1。如果两个字符串中都有一个字符,则其中存储的值为零。 1 + (-1)。第一个 for 循环是输入。
你能解释一下这个循环正在检查什么,它是如何设置变量 i 的值的:
for(i=257;--i&&!t[i-1];);
代码来自:https://developerinsider.co/find-anagram-string-programming-puzzles/
【问题讨论】:
看到这个让我头疼。查找新教程。 这是一团糟,但如果你解码它会怎么样,for (i = 257; --i != 0 && t[i-1] == 0;) ;
。 ;
最后是一个空语句,不执行任何操作。
【参考方案1】:
只是为了好玩,让我们分解一下:
int t[256],i; // Relying on the fact that global vars are initialized
int main(int c) // Not a legal signature for main
for(;c+3;) // What is c's initial value? Assuming it is 1
(i=getchar())>10?t[i]+=c:(c-=2); // Read a char from stdin
// If it is not a newline add c (1 or -1) to t[i]
// - that is: increment or decrement letter count
// If it is the 1st newline, c = c - 2 = -1;
// So for the first word, increment letter count
// For 2nd word, decrement letter count
// When a 2nd newline is found c = c - 2 = -3
// This ends the loop since -3 + 3 = 0
for(i=257;--i&&!t[i-1];); // Starting at the end of the array, check
// each char code. They should all be 0
// if not, it wasn't an anagram
puts(i?"false":"true"); // If i did not reach 0 in previous loop,
// not an anagram
我现在需要喝一杯。
【讨论】:
天哪,我也参加了!如果我知道你在帮忙就过去了;) @AntoninGAVREL 没问题。为了理解这段代码,我们可能需要 2 个答案:) 现在就喝吧!当然是 Gimli 那种饮料 :) 我认为我们需要它【参考方案2】:代码高尔夫简介
你打高尔夫球吗?不,我的意思是this kind of golf
#include <stdio.h> // for getchar lib, not even mandatory to compile...
int t[256],i; // t is where you store the user input
int main(int c) // reusing the register of argc, equal to 1 // NB: if using any argument your program will fail but ok.
for(;c+3;) // it loops until c reach -3, currently at 1
(i=getchar())>10?t[i]+=c:(c-=2);
// i=getchar() // get user input
// (i=getchar())>10? // if user input > 10 means as long as the user
// does not press enter, as '\n' is equal to 10.
// t[i]+=c:(c-=2); // if user input is valid (>10) then the array t at index of your character will either be incremented (if first input)
// or decremented (if second input, as the first '\n' will decrement t[i] since c == -1) as c will be respectively equal to +1 and -1.
// then it will exit the loop on the second input (c = -3)
for(i=257;--i&&!t[i-1];);
// start from the end, i is predecrement and we access index i-1 to automatically
// exit the loop when i reach 1, no need to check with --i>=0 (--i >=0 is 3 chars instead of
// 2 char for t[i -1 ]). If t[i-1] is equal 0 it means that the // character was
// effectively cancelled out by the second string so t[i-1] == 0
// and !t[i-1] are equivalent
puts(i?"false":"true");
// at the end --i will decrement i from 1 to 0 and exit without
// reaching !t[0-1], if i is not 0 then it means the break occured
// before going through all the characters.
注意:如果不是为了打高尔夫球,当然不要创建这样的程序。
【讨论】:
嘿伙计,非常详细的解释。谢谢。也许您可以编辑并添加以下内容:C 将 0 视为 false,任何其他数字为 True。这就是当 i = 1 时第二个循环退出的原因。 --i 使其为 0(这是错误的)。你能解释一下为什么c取1的值吗?什么是 argc? (你的意思是论证 c 吗?还是别的什么) 不客气! c 取值为 1,因为 c(实际上是 argc)等于程序的参数数量,包括程序名称,因此如果启动 ./a.out 或使用 -o, argc 编译程序的任何名称= 1.gnu.org/software/libc/manual/html_node/Program-Arguments.html以上是关于这段代码在做啥。检查两个字符串的字谜的主要内容,如果未能解决你的问题,请参考以下文章