Deutsch English Français Italiano |
<vrmhfm$2tds$1@dont-email.me> View for Bookmarking (what is this?) Look up another Usenet article |
Path: ...!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!eternal-september.org!.POSTED!not-for-mail From: DFS <nospam@dfs.com> Newsgroups: comp.lang.c Subject: Re: Suggested method for returning a string from a C program? Date: Sat, 22 Mar 2025 10:29:13 -0400 Organization: A noiseless patient Spider Lines: 140 Message-ID: <vrmhfm$2tds$1@dont-email.me> References: <vrd77d$3nvtf$2@dont-email.me> <87a59hvgyk.fsf@nosuchdomain.example.com> <vrdi0g$47cb$3@dont-email.me> <mm72bl-1o2.ln1@otis.foo> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Injection-Date: Sat, 22 Mar 2025 15:29:11 +0100 (CET) Injection-Info: dont-email.me; posting-host="caec85518f16b7293c9106934e7d3d02"; logging-data="95676"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX19XpBzZ8AcrWMNszuDMw2Tl" User-Agent: Betterbird (Windows) Cancel-Lock: sha1:EeeRLkiZOvb2rdUBKZgM7HF92/Y= In-Reply-To: <mm72bl-1o2.ln1@otis.foo> Content-Language: en-US Bytes: 4575 On 3/22/2025 4:07 AM, Peter 'Shaggy' Haywood wrote: > Groovy hepcat DFS was jivin' in comp.lang.c on Wed, 19 Mar 2025 03:42 > pm. It's a cool scene! Dig it. > >> On 3/18/2025 11:26 PM, Keith Thompson wrote: >>> DFS <nospam@dfs.com> writes: >> >>> There's your problem. >>> >>> https://cses.fi/problemset/text/2433 >>> >>> "In all problems you should read input from standard input and write >>> output to standard output." >> >> ha! It usually helps to read the instructions first. >> >>> The autotester expects your program to read arguments from stdin, not >>> from command line arguments. >>> >>> It probably passes no arguments to your program, so argv[1] is a null >>> pointer. It's likely your program compiles (assuming the NBSP >>> characters were added during posting) and crashes at runtime, >>> producing no output. >> >> I KNEW clc would come through! >> >> Pretty easy fixes: >> >> 1 use scanf() > > Normally I'd say take care with scanf(). But in this case, since the > program is intended to be executed in an automated environment, it > should be fine. > The reason scanf() can be a bit iffy is that you can't control what a > user will enter. If you search Google or Duck Duck Go for "comp.lang.c > faq" you can find more information on this and other issues. (The FAQ > is still out there, people..., somewhere...) https://c-faq.com/ I still see links to that document from time to time, like on university websites. >> 2 update int to long >> 3 handle special case of n = 1 > > The problem definition doesn't mention any special case. You should, I > think, treat 1 like any other number. So the output for 1 should be > > 1 4 2 1 It's a 'special case' because n is already 1. Your code passed all CSES tests but this one. >> 4 instead of collecting the results in a char variable, I print >> them as they're calculated > > Yep, that's a more usual approach. > Another suggestion I have is to use a separate function to do part of > the work. But it's not vital. > Also, since the specification says that only positive numbers are to > be accepted, it makes sense (to me, at least) to use an unsigned type > for n. > One more thing: using while(1){...break;} is a bit pointless. You can > use do{...}while(1 != n) instead. > Here's my solution, for what it's worth: > > #include <stdio.h> > > unsigned long weird(unsigned long n) > { > printf("%lu", n); > > if(n & 1) > { > /* Odd - multiply by 3 & add 1. */ > n = n * 3 + 1; > } > else > { > /* Even - divide by 2. */ > n /= 2; > } > return n; > } > > int main(void) > { > unsigned long n; > > /* Get n from stdin. */ > scanf("%lu", &n); > > /* Now feed it to the algorithm. */ > do > { > n = weird(n); > putchar(' '); > } while(1 != n); > > printf("%lu\n", n); > return 0; > } Cool. I tweaked my original and got it down to: -------------------------------------------------------- #include <stdio.h> int main(void) { long n = 0; scanf("%ld", &n); while(n > 1) { printf("%ld ",n); n = (n % 2) ? (n * 3 + 1) : (n / 2); } printf("1\n"); return 0; } -------------------------------------------------------- I also liked the Number Spiral, Coin Piles and Palindrome Reorder problems. Thanks for the input!