如何在c中的3个用户输入字符串中制成字符串

时间:2018-12-13 00:20:26

标签: c string concatenation

说我有3个字符串:

    char a[9];
    char b[20];
    char c[20];

在记住a,b和c由用户输入的情况下,如何创建由先前字符串的内容组成的第三字符串。 当我将 strcpy 与a一起使用,然后将 strcat 与b和c一起使用,然后打印结果字符串d时,我得到了垃圾字符。这与每个字符串的NULL终止符有关还是我做错了其他事情? 谢谢

编辑:

    void getBasicDetails(char date_of_birth[9], char first_name[20], 
    char last_name[20])
    {
        char temp_dob[9];
        char temp_fname[20];
        char temp_lname[20];
        char file_name[50];
        int stop = 1;
        printf("Patient's Date of Birth (in format dd/mm/yy) : "); // 2 and 5
        while (stop == 1)
        {
            scanf("%s", &temp_dob);
            emptyBuffer();
            if ((temp_dob[2] == '/' && temp_dob[5] == '/'))
            {
                stop = 0;
                break;  
            }
            else
            {
            printf("Enter in format dd/mm/yy\n");
            }
        }
      date_of_birth = temp_dob;
      date_of_birth[9] = '\0';

      printf("Patient's First Name : ");
      scanf("%s", &temp_fname);
      emptyBuffer();
      first_name = temp_fname;
      first_name[20] = '\0';

      printf("Patient's Last Name : ");
      scanf("%s", &temp_lname);
      emptyBuffer();
      last_name = temp_lname;
      last_name[20] = '\0';

      strcat(file_name, first_name);
      strcat(file_name, last_name);
      strcat(file_name, date_of_birth);
      puts(file_name);
  }

3 个答案:

答案 0 :(得分:1)

关于发布的代码中的以下(和类似内容)行:

  scanf("%s", &temp_fname);
  ....
  first_name = temp_fname;
  1. temp_fname是一个数组,在C中,对数组的裸引用将降级为该数组第一个字节的地址。在设置数组时,在&的调用中将scanf()放在参数前面是无效的。
  2. 使用输入格式说明符时:%s和/或%[...]始终包括一个MAX CHARACTERS修饰符,该修饰符比输入缓冲区的长度小1。这是因为这两个输入说明符总是将NUL字节附加到输入
  3. 尝试复制字符串时,简单的分配将不起作用。只会发生的是将源地址复制到目标地址(可能会导致编译器输出错误消息),而不是使用分配:strcpy()strncpy()

编译时,请始终启用警告,然后修复这些警告。对于gcc的最低使用是:-Wall -Wextra -Wconversion -pedantic -std=gnu11)注意:其他编译器使用不同的选项来产生相同的结果

答案 1 :(得分:-1)

如果您不介意,可以张贴完整的代码吗?现在,我假设a,b和c都包含一些字符串,而d为空。

char a[9];
char b[20];
char c[20];
char d[60];

strcpy (b);
strcpy (a);
strcpy (c);
strcpy (d);
strcat (d, a);
strcat (d, b);
strcat (d, c);
puts(d);
printf(d);

此外,您可以利用sprintf函数执行相同的操作:

sprintf(d, "%s%s%s", a, b, c)

如果我正确执行此操作,则应该返回您想要的正确结果。 有关strcat()的更多信息,请检查以下链接: https://www.tutorialspoint.com/c_standard_library/c_function_strcat.htm

有关sprintf()的更多信息,请检查以下链接: https://www.geeksforgeeks.org/sprintf-in-c/

答案 2 :(得分:-1)

我不确定,但是如果您要创建由前面的字符串的内容组成的第三个字符串,请尝试以下操作:

   char str1[100];
   char str2[100];
   char str3[100];
   printf("Enter String1: \n");
   gets(str1);
   printf("\Enter String2:\n");
   gets(str2);
   strcpy(str3,str1);
   strcat(str3,str2);
   printf("String 3: %s", str3);