IT源码网

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

wyy 2024年02月27日 程序员 40 0

我的目标是写一个程序,从一个输入语句中读取最多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)); 


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


评论关闭
IT源码网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!