首页 > 解决方案 > c中的局部变量和内存

问题描述

C对内存分配有些陌生,并且想知道某些事情。我的功能如下:

size_t count_nwords(const char* str) {
    //char* copied_str = strdup(str);  // because 'strtok()' alters the string it passes through
    char copied_str[strlen(str)];
    strcpy(copied_str, str);
    size_t count = 1;

    strtok(copied_str, " ");
    while(strtok(NULL, " ") != 0) {
        count++;
    }

    //free(copied_str);

    return count;
}

该函数计算字符串中的单词数量(分隔符是空格,即“ ”)。我不希望修改传入参数的字符串。

我有两个问题:

  1. 方式(这是代码中的注释部分)是否应该strdup()优于strcpy()一种方式?我的理解是strcpy()足够和更快,但我不确定。
  2. 由于没有为size_t要返回的值分配内存(它是一个局部变量),是否应该这样做以确保函数是健壮的?还是使用size_t nwords = count_nwords(copied_input);完全安全并且总是能正确获得返回值?

谢谢!

编辑:我已经接受了与我的问题完全相关的唯一答案,但我建议阅读其他答案,因为它们对我在代码中犯的错误提供了很好的见解。

标签: cmemorymemory-management

解决方案


未能考虑空字符

// char copied_str[strlen(str)];
char copied_str[strlen(str) + 1];
strcpy(copied_str, str);

错误的算法

即使有上述修复,代码也会返回 1count_nwords(" ")

不必要的字符串复制

strtok()这里不需要。不需要字符串的副本。


替代方案:走线。

size_t count_nwords(const char* str) {
  size_t count = 0;
  while (*str) {
    while (isspace((unsigned char) *str)) {
      str++; 
    }
    if (*str) {
      count++;
      while (!isspace((unsigned char) *str) && *str) {
        str++; 
      } 
    }
  }
  return count;
}

推荐阅读