puts()不在main()中输出字符串,但在函数中打印出来很好
#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] = ' ' ;
}
// puts(c) <- when puts() is run here, desired output is given
}
在这个程序中,函数使用char a,并将其与分配给c的char b连接。
然后通过puts(c)将char c分类并打印在main函数中。
例如,
Enter the first string:
afkm
Enter the second string:
bbbggg
abbbfgggkm
mergeStr():
这是puts(c)从void mergeStr()函数内运行时得到的输出。
但是,int main()中的puts(c)不会打印任何内容。
这个:
/* Merge string a and string b together, then sort them alphabetically */
c = strcat(a,b) ;
不会做你期望的事情,它根本不写入调用者的(即main()
)缓冲区。 它用strcat()
的返回值覆盖c
(函数参数)的值,它将成为目标,即a
。
您需要了解C字符串的工作方式,以及处理它们的内存的方式。
该特定电话可以替换为:
sprintf(c, "%s%s", a, b);
但这是危险的,并且会覆盖缓冲区,因为没有将大小信息传递给函数(所以它不能使用snprintf()
)。
上一篇: puts() not printing out string in main() but prints fine in function