这段代码在做啥。检查两个字符串的字谜

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&amp;&amp;!t[i-1];);

代码来自:https://developerinsider.co/find-anagram-string-programming-puzzles/

【问题讨论】:

看到这个让我头疼。查找新教程。 这是一团糟,但如果你解码它会怎么样,for (i = 257; --i != 0 &amp;&amp; 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

以上是关于这段代码在做啥。检查两个字符串的字谜的主要内容,如果未能解决你的问题,请参考以下文章

这行 Java 代码在做啥?

检查两个字符串是不是是字谜的运行时间应该是多少

代码背后的逻辑确定两个 javascript 字符串是不是是字谜

这段代码在做啥[重复]

这段代码在做啥?

这是一个字谜程序,我正在检查两个相同长度的字符串是不是相互字谜