【问题标题】:strcpy and strcat in Keil C compilerKeil C 编译器中的 strcpy 和 strcat
【发布时间】:2016-12-03 09:17:06
【问题描述】:

我用这段代码打印了一些字符串,但它没有打印任何东西。
有什么问题?

char* getNotFilledEncryptionParams(void)
{
    char* nofilledStr;
    char tmp[3];
    const char * arr[]= {" P,"," Q,"," A,"," B,"," C,"," R,"," S0,","S1,","S2,","F1,","G1"};


   for(i=0;i<11;i++)
   {
      if(filledParams[i] == 0)
      {
        strcpy(tmp,arr[i]);
        strcat(nofilledStr,tmp);
      }
   }

return nofilledStr;
}

用法:

int main(void){

    char *remaining;

    remaining = getNotFilledEncryptionParams();
    printf("\r\n Remaining item:%s",remaining);

}

我认为问题出在const char * arr[] 并且我更改了它,但问题仍然存在。

【问题讨论】:

  • 一方面,当您使用 strcpy() 时,tmp[3] 应该至少有 4 个字符宽以容纳 NULL。什么是填充参数?
  • 那是一个整数数组。 @clarasoft-它
  • 通过这个tmp 变量拖动字符串是没有用的。为结果字符串分配空间后,您可以直接将arr[i] 附加到结果字符串中。
  • @clarasoft-it: NULL 是一个空指针常量。你的意思是空字符,'\0'
  • 关于标题,我很确定这与任何编辑器无关。

标签: c printf malloc strcpy keil


【解决方案1】:
  1. 您没有为noFilledStr 分配任何内存,因此它的值是不确定的,strcat(noFilledStr, tmp) 是未定义的。

    使用malloc分配内存并用返回的指针初始化noFilledStr

    char* noFilledStr = malloc(number_of_bytes);
    
  2. arr 中的字符串是 char[4],而不是 char[3](不要忘记空字节!)。 tmp 太小,无法容纳它们,因此 strcpy(tmp, arr[i]) 写入超出范围。

【讨论】:

  • 我可以将 char* noFilledStr 替换为 char noFilledStr[30] 吗?
  • 此外,您将返回未在任何地方分配的数据,当您在函数中创建本地数据时,它是临时的并且仅在堆栈上创建。如果要返回字符串,则应分配内存并返回分配内存的起始地址。
  • @Hamid 不,因为您从函数返回指向它的指针,然后自动数组 char noFilledStr[30] 将结束其生命周期。阅读this
【解决方案2】:

您正在尝试构建要在nofilledStr 指向的位置返回的字符串,但是该指针指向某个位置,因为您没有对其进行初始化。如果您不必处理多个线程,则可以使用足够大的静态 char[] 数组。否则,使用malloc() 并要求调用者在完成后将返回的字符串free()

【讨论】:

    猜你喜欢
    • 2016-01-21
    • 1970-01-01
    • 2017-03-15
    • 2018-04-23
    • 2016-03-14
    • 1970-01-01
    • 2014-08-06
    • 2015-01-10
    • 2018-06-21
    相关资源
    最近更新 更多