【问题标题】:puts() not printing out string in main() but prints fine in functionputs() 不在 main() 中打印出字符串,但在函数中打印得很好
【发布时间】:2018-03-16 13:04:00
【问题描述】:
#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 ,将它与分配给 c 的 char b 连接起来。

char c 然后通过 puts(c) 在 main 函数中排序并打印出来。

例如,

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

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

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

【问题讨论】:

  • 不要使用gets(),这是一个废弃的旧危险函数。

标签: c


【解决方案1】:

这个:

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

并没有按照您的预期进行,它根本不会写入调用者的(即main()'s)缓冲区。它将strcat() 的返回值覆盖c(函数参数)的值,这将是目标,即a

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

该特定调用可以替换为:

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

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

【讨论】:

  • 这是否意味着c在strcat()之后变成了局部变量?
  • 这有点令人困惑,为什么 strcat() 会使 c 成为局部变量?换句话说,假设我创建了另一个 temp char[80] 并做了 temp = strcat(a,b) 然后将其分配给 c,我的代码可以工作吗?对不起,如果我的解释不清楚。
  • @JoeyNgo c 是函数第三个参数的名称,在函数内部,该名称指的是第三个参数的值。在另一个范围内,即在 main() 中,称为 c 的变量不会发生任何事情,当然 strcat() 本身并没有做类似的事情。对于你的最后一个问题:你不能分配给数组,所以这永远不会起作用。
  • hmm,据我了解,由于参数是 *char c,所以在这个 void 函数中所做的更改也不会在 main 中更改吗?因为它是一个指针,我正在更改创建 c 的相同地址位置(在 main 中)
  • @JoeyNgo *c = something(或其他一些取消引用,例如sprintf)确实会改变缓冲区包含的内容。但是c = something重新指向了本地指针c
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-04
  • 1970-01-01
  • 1970-01-01
  • 2017-11-25
  • 1970-01-01
相关资源
最近更新 更多