gpt4 book ai didi

c - 需要帮助结合两个C代码

转载 作者:太空宇宙 更新时间:2023-11-04 06:04:34 26 4
gpt4 key购买 nike

我的目标是写一个程序,从一个输入语句中读取最多100个字符,然后从存储的数据中输出3个字符。该输入语句的反向,数组的奇数元素和数组的偶数元素。因此,我有3个printf函数。我有2个单独的代码来执行此操作,并且无法弄清楚如何将两者结合起来。

#include <stdio.h>

int main(void){
int i, j;
char str[100];
printf("Enter String\n");

fgets(str, sizeof str, stdin);
printf("\nString in Reverse Order\n");

i = 0;
while(str[i] != '\0')
{
if(str[i] == ' ' || str[i] == '\n')
{
for(j = i - 1; j >= 0 && str[j] != ' '; j--)
printf("%c", str[j]);

printf(" ");
}
i++;
}

printf("\n");
return 0;
}


我的第二个代码是:

#include <stdio.h>
#include <string.h>

int main() {
char string[100], even[100], odd[100], i, j, k;

i = j = k = 0;

printf("Enter your input string:");
fgets(string, 100, stdin);
string[strlen(string) - 1] = '\0';

while (string[i] != '\0') {
if (i % 2 == 0) {
odd[j++] = string[i];
} else {
even[k++] = string[i];
}
i++;
}

odd[j] = even[k] = '\0';

printf("Characters at odd position: %s\n", odd);
printf("Characters at even position: %s\n", even);
return 0;
}


任何输入将不胜感激!

所以我一直在搞弄它,并接受您的所有意见。我到目前为止的代码如下。我正在使奇数和偶数起作用,但是当我输入“ Hello”时,字符串以相反的顺序显示:“ eH lleH” ..我正尝试将其分解以查看出现此问题的位置,但是我认为遗漏了什么。

#include <stdio.h>
#include <string.h>

int main() {

int m;
char string[100], even[100], odd[100], i, j, k;

i = j = k = 0;

//get the input string from the user
printf("Enter your input string:");

fgets(string, 100, stdin);

printf("\nString in Reverse Order\n");

string[strlen(string) - 1] = '\0';

while(string[i] != '\0'){
if(string[i] == ' ' || string[i] == '\n' || i % 2 == 0)
{

for(m = i - 1; m >= 0 && string[m] != ' '; m--)
printf("%c", string[m]);

printf(" ");

odd[j++] = string[i];
}

else {
even[k++] = string[i];
}
i++;
}


//terminating even and odd string with NULL
odd[j] = even[k] = '\0';

printf("\n");
//print the charactersa at odd position and even positions
printf("Characters at odd position: %s\n", odd);
printf("Characters at even position: %s\n", even);

return 0;
}

最佳答案

作为suggested,将comment转换为答案,并将其扩展(答案中没有600个字符的限制)。

您具有读取一行并切掉换行符的代码;将其打包为函数1.将数组和数组大小从主程序传递到函数中;返回读取的字符串的长度。

您有代码可以反向打印字符串。这样可以更简单,因为您不再需要担心换行符,因为功能1已将其删除。将其打包为功能2。

您有代码来查找和打印字符串的奇数元素和偶数元素;将其打包为函数3。同样,您可以将数组和字符串长度传递给函数,这使得编写起来更加容易。

然后,您的主程序声明变量并调用函数。您应该为我指定的函数使用更有意义的名称-但是在下面的代码中,当我使用函数时,我坚持使用数字名称,以便可以清楚地看到对应的名称。

这或多或少是使用任何代码的方式。您编写了可完成可识别任务的函数,然后安排其他代码以适当的顺序调用这些函数。您将学习如何将参数传递给函数并从函数返回合适的值,并使用它们来指导代码。在某种程度上,您已经熟悉使用函数执行任务的过程。例如,您使用fgets()strlen():它们各自都有不同的工作要做,但是代码是可重用的,因此由标准C库提供。您的代码将不太可重用,因此不太可能成为标准C库的一部分,但是有时您会编写可重复使用的代码,以使其进入您自己的个人库。

看一下函数3。它完成两项工作:也许应该将其分为两个独立的函数,一个用于奇数元素,另一个用于偶数元素。或者,也许有一个隐藏在其中的通用函数:从第M个元素开始打印字符串的每个第N个元素。也许函数应该简单地将N / M元素复制到新数组中(传递给函数),然后协调函数应调用提取代码,然后打印代码。通常将I / O与算法的其余部分分开。混合使用这两种功能的函数通常不太可重用。 (功能2也可能受益于算法和I / O的分离。通用字符串反向器可能会有用。)

还要注意,没有一个正确的结果。在很大程度上取决于上下文。但是考虑到示例代码,我认为三个功能加上main可能是相互竞争的利益之间的适当平衡。但是重要的是不要害怕创建和使用函数。



出于所有应有的考虑,您提出的解决方案会混淆处理过程,并使代码不必要地变得复杂。这就是我所说的三个功能:

combo1.c

#include <stdio.h>
#include <string.h>

static int function_1(char *buffer, size_t buflen)
{
printf("Enter your input string: ");

if (fgets(buffer, buflen, stdin) == 0)
return 0;
int len = strlen(buffer);
if (len > 0)
buffer[--len] = '\0';
return len;
}

static void function_2(char *string, int len)
{
printf("String in Reverse Order: ");
for (int i = len; i >= 0; i--)
putchar(string[i]);
putchar('\n');
}

static void function_3(char *string, int len)
{
char even[100];
char odd[100];
int j = 0;
int k = 0;

for (int i = 0; i < len; i++)
{
if (i % 2 == 0)
even[k++] = string[i];
else
odd[j++] = string[i];
}
odd[j] = even[k] = '\0';

// print the characters at odd position and even positions
printf("Characters at odd position: %s\n", odd);
printf("Characters at even position: %s\n", even);
}

int main(void)
{
char string[100];
int len;

while ((len = function_1(string, sizeof(string))) != 0)
{
function_2(string, len);
function_3(string, len);
}
putchar('\n');

return 0;
}


样品运行

$ ./combo1
Enter your input string: Hello World!
String in Reverse Order: !dlroW olleH
Characters at odd position: el ol!
Characters at even position: HloWrd
Enter your input string: AManAPlanACanalPanama
String in Reverse Order: amanaPlanaCAnalPAnaMA
Characters at odd position: MnPaAaaPnm
Characters at even position: AaAlnCnlaaa
Enter your input string: ^D
$


在我的Mac上,终端设置为回显控制字符,这就是为什么 ^D出现在我键入Control-D来指示输入结束的位置的原因。最后的 putchar('\n');用于将提示放在下一行。

combo2.c

像您一样进行组合,您仍然应该简化代码(但是,使多个输入上的代码循环比使用功能的代码难得多,主要是因为您必须获得提示以及对循环条件的验证,因为这样做–是使用函数的主要原因)。此代码仅执行一个循环:

#include <stdio.h>
#include <string.h>

int main(void)
{
char string[100];

printf("Enter your input string: ");

if (fgets(string, sizeof(string), stdin) == 0)
{
putchar('\n');
return 0;
}
int len = strlen(string);
if (len > 0)
{
string[--len] = '\0';

printf("String in Reverse Order: ");
for (int i = len; i >= 0; i--)
putchar(string[i]);
putchar('\n');

char even[100];
char odd[100];
int j = 0;
int k = 0;

for (int i = 0; i < len; i++)
{
if (i % 2 == 0)
even[k++] = string[i];
else
odd[j++] = string[i];
}
odd[j] = even[k] = '\0';

// print the characters at odd position and even positions
printf("Characters at odd position: %s\n", odd);
printf("Characters at even position: %s\n", even);
}

return 0;
}


样品运行

$ ./combo2
Enter your input string: AManAPlanACanalPanama
String in Reverse Order: amanaPlanaCAnalPAnaMA
Characters at odd position: MnPaAaaPnm
Characters at even position: AaAlnCnlaaa
$


combo3.c

而且,如果您坚持要在读取后仅执行字符串的一个循环,则可以将两个循环更干净地组合为一个循环,如下所示:

#include <stdio.h>
#include <string.h>

int main(void)
{
char string[100];

printf("Enter your input string: ");

if (fgets(string, sizeof(string), stdin) == 0)
{
putchar('\n');
return 0;
}
int len = strlen(string);
if (len > 0)
{
string[--len] = '\0';

char even[100];
char odd[100];
int j = 0;
int k = 0;

printf("String in Reverse Order: ");
for (int i = 0; i < len; i++)
{
putchar(string[len - i]);
if (i % 2 == 0)
even[k++] = string[i];
else
odd[j++] = string[i];
}
putchar('\n');
odd[j] = even[k] = '\0';

printf("Characters at odd position: %s\n", odd);
printf("Characters at even position: %s\n", even);
}

return 0;
}


样品运行

$ ./combo3
Enter your input string: A Man, A Plan, A Canal, Panama!
String in Reverse Order: !amanaP ,lanaC A ,nalP A ,naM
Characters at odd position: a,APa,ACnl aaa
Characters at even position: AMn ln aa,Pnm!
$


combo4.c

回到原始的基于函数的版本,我可以重命名函数,并通过控制 main()程序中的输出然后重用函数来提供更好的职责分离。请注意,我可以使用 print_reversed_string()三次,对于两次使用,该字符串甚至不在行尾。

#include <stdio.h>
#include <string.h>

static int read_line(const char *prompt, char *buffer, size_t buflen)
{
printf("%s: ", prompt);
fflush(stdout);

if (fgets(buffer, buflen, stdin) == 0)
return 0;
int len = strlen(buffer);
if (len > 0)
buffer[--len] = '\0';
return len;
}

static void print_reversed_string(char *string, int len)
{
for (int i = len; i >= 0; i--)
putchar(string[i]);
}

static void extract_odd_even(char *string, int len, char *odd, char *even)
{
int j = 0;
int k = 0;

for (int i = 0; i < len; i++)
{
if (i % 2 == 0)
even[k++] = string[i];
else
odd[j++] = string[i];
}
odd[j] = even[k] = '\0';
}

int main(void)
{
char string[100];
char even[100];
char odd[100];
int len;

while ((len = read_line("Enter your input string", string, sizeof(string))) != 0)
{
printf("String in Reverse Order: ");
print_reversed_string(string, len);
putchar('\n');
extract_odd_even(string, len, odd, even);
printf("Characters at odd position: %s\n", odd);
printf("Characters at even position: %s\n", even);
printf("Reversed even characters: [");
print_reversed_string(odd, strlen(odd));
printf("]\n");
printf("Reversed odd characters: [");
print_reversed_string(odd, strlen(odd));
printf("]\n");
}
putchar('\n');

return 0;
}


运行示例

$ ./combo4
Enter your input string: A Man, A Plan, A Canal, Panama!
String in Reverse Order: !amanaP ,lanaC A ,nalP A ,naM A
Characters at odd position: a,APa,ACnl aaa
Characters at even position: AMn ln aa,Pnm!
Reversed even characters: [aaa lnCA,aPA,a ]
Reversed odd characters: [aaa lnCA,aPA,a ]
Enter your input string: Gratuitous Display of Lunacy
String in Reverse Order: ycanuL fo yalpsiD suotiutarG
Characters at odd position: rtiosDslyo uay
Characters at even position: Gautu ipa fLnc
Reversed even characters: [yau oylsDsoitr]
Reversed odd characters: [yau oylsDsoitr]
Enter your input string: ^D
$


这就是功能使生活更轻松的方式。有空间将 reverse_string()分隔为无法打印的功能:

static void reverse_string(const char *i_buff, int i_len, char *o_buff)
{
for (i = 0; i < i_len; i++)
o_buff[i] = i_buff[i_len - i];
o_buff[len] = '\0';
}


然后,您可以反转字符串并多次使用反转后的值。您甚至可以使用:

static char *reverse_string(const char *i_buff, int i_len, char *o_buff)
{
for (i = 0; i < i_len; i++)
o_buff[i] = i_buff[i_len - i];
o_buff[len] = '\0';
return o_buff;
}


因此您可以将冲销嵌入到对 printf()的调用中:

char rev[100];
printf("Reversed odd characters: [%s]\n", reverse_string(odd, strlen(odd), rev));


所有这些都是针对您原始问题的有效变体设计。

关于c - 需要帮助结合两个C代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35532670/

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