【问题标题】:C function for returning custom length char用于返回自定义长度字符的 C 函数
【发布时间】:2017-06-22 09:56:37
【问题描述】:

请注意,我是 C 新手。我正在编写一个函数,该函数接收一个数字并返回由接收长度的 '*' 形成的 *char。即:

createHiddenName(6)//returns "******"
createHiddenName(4)//returns "****"

我已经这样编码了,但它不起作用:

char *createHiddenName(int length)
{
    char *hidden[length];//
    int i;
    for (i = 0; i < length; i++) {
        hidden[i] = '*';
    }
    return *hidden;
}

任何帮助将不胜感激。非常感谢

【问题讨论】:

  • return *hidden;....什么?为什么?
  • 不返回任何东西,传递一个缓冲区来填充。
  • 编译时打开所有警告。认真对待编译器的警告。修复代码,直到不再发出警告。不要盲目地“抛弃”警告。
  • 获得一本好的初学者书籍。从反复试验中学习 C 可能会导致灾难。拥有所有链接的人在哪里?
  • @DeiDei - I got you covered

标签: c string function for-loop


【解决方案1】:

两大问题:

char *hidden[length];

这将hidden 定义为指向char指针 数组。它可以是 strings 的数组,而不是字符串本身。

然后你尝试返回一个指向这个数组的指针,但是这个数组是一个超出范围的局部变量,一旦函数返回就不再存在。使用返回的指针将导致未定义的行为

最简单的解决方案是将要填充的缓冲区作为参数传递。类似的东西

char *createHiddenName(int length, char *hidden)
{
    ...
    return hidden;
}

当然记得创建一个足够大的缓冲区来保存完整的字符串包括空终止符(你现在不添加)。

【讨论】:

    【解决方案2】:

    您需要使用如下动态内存分配

    char *createHiddenName(int length)
    {
      char *hidden = malloc((length+1) * sizeof(char));
      if(hidden == NULL) {
        return NULL;
      }
      int i;
      for (i = 0; i < length; i++) {
        hidden[i] = '*';
      }
      hidden[i] = '\0'; //Null terminated string
      return hidden;
    }
    

    确保在完成hidden 变量后需要释放内存。

    char *ptr = createHiddenName(10);
    //....
    // Use ptr
    //....
    // done ? then free it 
    free(ptr);
    ptr = NULL;
    

    【讨论】:

    • 非常感谢。
    • sizeof(char) 是一个定义。
    【解决方案3】:

    在你原来的方法中,你有,

       char *hidden[length]; // Why would you like to have an array of pointers?
       return *hidden; // Wrong because unless 'malloc'ated, a pointer inside the function will not work after the return, Consider what happens if the function stack is cleared.
    

    相反,您可以按照以下方法。

    #include<stdio.h>
    #include<string.h>
    char hidden_name[100]; 
    // global char array for storing the value returned from function
    char *createHiddenName(int length)
    {
                char temp[length+1];
                int i;
                for (i = 0; i < length; i++) {
                            temp[i] = '*';
                            }
                    temp[i]='\0'; // Null terminating  temp
                strncpy(hidden_name,temp,(size_t)(length+1));
                //Remember temp perishes after function, so copy temp to hidden_name
                return hidden_name;
    }
    
    
    int main(){
    printf("Hidden Name : %s\n",createHiddenName(6));
    return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-17
      • 1970-01-01
      • 2023-04-01
      • 2019-04-18
      • 2017-08-09
      • 2016-05-12
      • 2010-11-18
      • 1970-01-01
      相关资源
      最近更新 更多