puts()不会在main()中打印出字符串,但在函数中打印正常

时间:2018-03-16 13:04:01

标签: c

#include <stdio.h>
#include <string.h>
void mergeStr(char *a, char *b, char *c);
int main()
{
  char a[80],b[80]; 
  char c[80];
  printf("Enter the first string: \n");
  gets(a);
  printf("Enter the second string: \n");
  gets(b);
  mergeStr(a,b,c);
  printf("mergeStr(): ");
  puts(c); 
  return 0;
}
void mergeStr(char *a, char *b, char *c)
{
  int size; int i ; int j=0 ; // again, forgot to initialize j 
  char ch; 
  char temp[80] ; 
  /* Merge string a and string b together, then sort them alphabetically  */
  c = strcat(a,b) ;
  size = strlen(c) ;
  for (ch = 'A' ; ch <= 'z' ; ch++ ) { // iterates from A-Z and a-z  
    for (i=0 ; i<size ; i++) { // which for loop comes first is important, in this case since we want duplicates we should allow i to iterate everything for every case of ch 
      if (c[i] == ch){
        temp[j] = c[i] ; 
        j++ ; 
      }
    }
  }
  for (i=0 ; i<size ; i++) {
    c[i] = temp[i] ; // assign sorted string back to c  
    c[size] = '\0' ;
  }
  // puts(c) <- when puts() is run here, desired output is given
}

在这个程序中,该函数接受char a,将其与char b连接,char b分配给c。

然后将char c分类并在puts函数中通过puts(c)打印出来。

例如,

Enter the first string:
afkm
Enter the second string:
bbbggg
abbbfgggkm
mergeStr(): 

这是从void mergeStr()函数中运行puts(c)时得到的输出。

但是,来自int main()的puts(c)不会打印任何内容。

1 个答案:

答案 0 :(得分:4)

此:

/* Merge string a and string b together, then sort them alphabetically  */
c = strcat(a,b) ;

没有按照您的期望行事,它根本不会写入来电者(即main())的缓冲区。它将c(函数参数)的值覆盖为strcat()的返回值,它将是目标,即a

您需要了解C字符串的工作方式,以及如何处理存储它们的内存。

该特定电话可以替换为:

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

但是这很危险并且有覆盖缓冲区的风险,因为没有大小信息传递到函数中(所以它不能使用snprintf())。