【问题标题】:Merging strings together based on command line arguments.根据命令行参数将字符串合并在一起。
【发布时间】:2018-05-18 14:53:54
【问题描述】:

我正在尝试用 C 编写一个程序,根据给定的命令行参数以两种不同的方式将 2 个字符串合并在一起。

'-i' 交替合并字符串,像这样

combine_strings –i 请输入最多 30 个字符的字符串:abcde 请输入最多 30 个字符的字符串:1234567 组合字符串为:a1b2c3d4e567

'-w' 将两个字符串连接在一起,并在字符串的每个字符之间插入一个'*',像这样

组合字符串 -w 请输入最多 30 个字符的字符串:abcde 请输入最多 30 个字符的字符串:1234567 组合字符串为:abcde*1*2*3*4*5*6*7

这是我目前得到的。

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

void alt_merge(char *string1,char *string2,char *stringfinal){

while (*string1 != '\0' && *string2 != '\0')
{
    *stringfinal++= *string1++;
*stringfinal++ = *string2++;
}
while (*string1 != '\0')
    *stringfinal++=*string1++;
while (*string2 != '\0')
    *stringfinal++ = *string2++;
*stringfinal='\0';
}

void concate_star(char *string1,char *string2,char *stringfinal){

strcpy(stringfinal,strcat(string1,string2));
}

int main(int argc,char *argv[]){
char *string1[30+1];
char *string2[30+1];
char *stringfinal=malloc(strlen(string1)+strlen(string2)+1);

if(argv[1]=='-i'){
        printf("Please enter a string of maximum 30 characters: ");
        scanf("%s",&string1);
        printf("Please enter a string of maximum 30 characters: ");
        scanf("%s",&string2);

        alt_merge(string1,string2,stringfinal);

        printf("The combined string is: %s",stringfinal);
}      
else if(argv[1]=='-w'){
        printf("Please enter a string of maximum 30 characters: ");
        scanf("%s",&string1);
        printf("Please enter a string of maximum 30 characters: ");
        scanf("%s",&string2);

        concate_star(*string1,*string2,*stringfinal);

        printf("The combined string is: %s",stringfinal);
}       

return 0;
}

我收到这些错误消息。

jdoodle.c: In function 'main':
jdoodle.c:27:23: warning: implicit declaration of function 'malloc' [-Wimplicit-function-declaration]
     char *stringfinal=malloc(strlen(string1)+strlen(string2)+1);
                       ^~~~~~
jdoodle.c:27:23: warning: incompatible implicit declaration of built-in function 'malloc'
jdoodle.c:27:23: note: include '<stdlib.h>' or provide a declaration of 'malloc'
jdoodle.c:27:37: warning: passing argument 1 of 'strlen' from incompatible pointer type [-Wincompatible-pointer-types]
     char *stringfinal=malloc(strlen(string1)+strlen(string2)+1);
                                     ^~~~~~~
In file included from jdoodle.c:2:0:
/usr/include/string.h:384:15: note: expected 'const char *' but argument is of type 'char **'
 extern size_t strlen (const char *__s)
               ^~~~~~
jdoodle.c:27:53: warning: passing argument 1 of 'strlen' from incompatible pointer type [-Wincompatible-pointer-types]
     char *stringfinal=malloc(strlen(string1)+strlen(string2)+1);
                                                     ^~~~~~~
In file included from jdoodle.c:2:0:
/usr/include/string.h:384:15: note: expected 'const char *' but argument is of type 'char **'
 extern size_t strlen (const char *__s)
               ^~~~~~
jdoodle.c:29:17: warning: multi-character character constant [-Wmultichar]
     if(argv[1]=='-i'){
                 ^~~~
jdoodle.c:29:15: warning: comparison between pointer and integer
     if(argv[1]=='-i'){
               ^~
jdoodle.c:35:23: warning: passing argument 1 of 'alt_merge' from incompatible pointer type [-Wincompatible-pointer-types]
             alt_merge(string1,string2,stringfinal);
                       ^~~~~~~
jdoodle.c:5:6: note: expected 'char *' but argument is of type 'char **'
 void alt_merge(char *string1,char *string2,char *stringfinal){
      ^~~~~~~~~
jdoodle.c:35:31: warning: passing argument 2 of 'alt_merge' from incompatible pointer type [-Wincompatible-pointer-types]
             alt_merge(string1,string2,stringfinal);
                               ^~~~~~~
jdoodle.c:5:6: note: expected 'char *' but argument is of type 'char **'
 void alt_merge(char *string1,char *string2,char *stringfinal){
      ^~~~~~~~~
jdoodle.c:39:22: warning: multi-character character constant [-Wmultichar]
     else if(argv[1]=='-w'){
                      ^~~~
jdoodle.c:39:20: warning: comparison between pointer and integer
     else if(argv[1]=='-w'){
                    ^~
jdoodle.c:45:44: warning: passing argument 3 of 'concate_star' makes pointer from integer without a cast [-Wint-conversion]
             concate_star(*string1,*string2,*stringfinal);
                                            ^
jdoodle.c:19:6: note: expected 'char *' but argument is of type 'char'
 void concate_star(char *string1,char *string2,char *stringfinal){
      ^~~~~~~~~~~~

我是编程新手,感谢任何帮助和建议。

【问题讨论】:

    标签: c string pointers strcpy strcat


    【解决方案1】:

    两个问题,你没有将stdlib.h 包含在函数malloc() 的声明中。

    另外,您向strlen() 传递了错误的参数,但您传递了char**。其他功能也一样。你的参数不匹配。

    char *string1[30+1];
    char *string2[30+1];
    

    你想要的

    char string1[30+1];
    char string2[30+1];
    

    当您将"-i"argv[1] 进行比较时,您还应该使用strcmp

    现在argv 基本上是char* 的数组。而且您基本上是在将带有 (string) 的空字符数组与"-i" 进行比较。 (不是'-i')。

    还注意到一件有趣的事情,

    编译器说

    jdoodle.c:29:15: warning: comparison between pointer and integer
         if(argv[1]=='-i'){
                   ^~
    

    包含多个 c-char 的普通字符文字是 多字符文字。多字符文字的类型为 int 和 实现定义的值。

    '-i' 是一个多字符文字。这具有int 类型,这就是pointerint 之间的警告比较的原因。

    还有一件事你应该清楚地知道,当你将一个数组传递给一个函数时,它会衰减为指向数组第一个元素的指针。

    char *s[100] 衰减为 char**,因为数组的内容是 char*,指向它的指针将是 char**

    【讨论】:

    • 感谢您的快速回复和清晰的解释。实施了您的建议,现在一切正常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-25
    • 1970-01-01
    • 1970-01-01
    • 2012-12-24
    • 2015-09-08
    • 2021-12-04
    • 2021-08-19
    相关资源
    最近更新 更多