【问题标题】:How to iterate through a char* in C99? [duplicate]如何在 C99 中遍历 char*? [复制]
【发布时间】:2018-11-13 03:00:59
【问题描述】:

我已经尝试了一些不同的方法来让它工作,但基本上我有一个 6 个字母长(最大)的名称,我需要将它输入到 char* 车中来代替“-”。例如,如果名字是 Bob,那么汽车应该看起来像 ~O=Bob----o>

typedef struct Racer_S {

    int row;       ///< vertical row or "racing lane" of a racer

    int distance;  ///< column of rear of car, marking its position in race

    char *graphic; ///< graphic is the drawable text of the racer figure

} Racer;

Racer * make_racer( char *name, int row ){
        Racer *newRacer;
        char *car = "~O=-------o>";
        for (int i = 0; i < strlen(name); ++i)
            car[i+3] = name[i];
    //    printf("%s\n",car);
    //    newRacer->row = row;
    //    newRacer->distance = 0;
    //    newRacer->graphic = car;
        return newRacer;
    }

【问题讨论】:

  • Racer 到底是什么?它是你可以控制的吗?
  • 在许多平台上,您将无法修改该缓冲区。即使你能够做到,你 A) 丢弃它,并且 B) 它在堆栈上。
  • Racer 是指向 char * 的指针吗?请提供定义
  • 旁注:依靠编译器只计算一次strlen 不是一个好主意。我强烈建议在循环外部只计算一次strlen(name),将其存储到一个变量中,然后将其用于循环条件测试,而不是通过重复@ 使你的循环潜在地O(n**2) 987654327@ 测试strlen 次。

标签: c arrays string c99


【解决方案1】:

car 指向一个字符串常量。这些是只读的,所以你不能修改它们。

相反,为一个字符串分配内存,然后修改它:

char *car = strdup("~O=-------o>");

你还需要为 newRacer 分配内存:

Racer *newRacer = malloc(sizeof(*newRacer));

不要忘记检查这些函数的返回值,以防它们失败。

【讨论】:

  • 这个问题之前已经回答过多次了。而不是发布另一个答案,你应该去C wiki FAQ,从列表中选择一个规范的副本,“字符串”部分,然后关闭问题。
  • 话虽如此,教新手使用 strdup 却不声明它是不可移植的并不是一个好主意。
【解决方案2】:

问题在于您声明car 的方式。当定义为带有字符串文字的char* 时,真正发生的事情是将对字符串的引用存储在只读内存区域中。为了避免这种情况,您只需将变量声明为char[],如下所示:

char car[] = "~O=-------o>";

这基本上是以下等效代码的语法糖:

char car[] = { '~', 'O', '=', '-', '-', '-', '-', '-', '-', '-', 'o', '>', '\0' };

【讨论】:

  • 使用大括号进行初始化时应包含尾随 NUL 字符:..., '&gt;', '\0'};
猜你喜欢
  • 1970-01-01
  • 2017-03-19
  • 1970-01-01
  • 2010-11-22
  • 2021-12-30
  • 1970-01-01
  • 2013-08-11
  • 2017-12-10
  • 1970-01-01
相关资源
最近更新 更多