【问题标题】:Looping a Const Char循环一个常量字符
【发布时间】:2010-01-20 20:34:48
【问题描述】:

我需要循环一个const char,我使用了一个简单的字符串循环示例:

const char *str;
for(int i = 0; i < 10; ++i)
{
   str += " ";
}

但是当我尝试编译时,我得到了这个:

ubuntu@eeepc:~/Test_C_OS$ gcc -o kernel.o -c kernel.c -Wall -Wextra -nostdlib -nostartfiles -nodefaultlibs
kernel.c:26:错误:在 C99 模式外使用的“for”循环初始声明
kernel.c:28: 错误:二进制操作数无效 +
ubuntu@eeepc:~/Test_C_OS$

我该怎么办?

【问题讨论】:

  • 你问这个是为了好玩还是你真的想要一些严肃的答案?您的个人资料看起来不需要问这样的问题。
  • 个人资料表明他是 C++ 新手
  • 这段代码是您新操作系统的核心吗?
  • 内森是一个介于天真和巨魔之间的奇怪混合体。如果不认真对待(或根本不认真对待),他在这里提出的问题可以提供数小时的天真娱乐。

标签: c loops char constants


【解决方案1】:

你的第一个错误是因为你做了:

for (int i = 0; ...

代替:

int i;
for (i = 0; ...)

(或者,您可以不理会该位并将-std=gnu99 添加到您的 gcc 选项中)。

您的第二个错误是因为该行:

   str += " ";

尝试添加两个指针值。这在 C 中没有任何定义的语义——它没有任何意义。您试图在这里做什么甚至都不是特别清楚 - 也许您想从一个空字符串开始,然后将字符串 " " 的 10 个副本附加到它?如果是这样,那么您需要将其更改为:

char str[100]; /* Allocate space for a 99 character string, plus terminator */
int i;

str[0] = '\0'; /* Start with empty string */
for (i = 0; i < 10; i++)
{
    strcat(str, " ");
}

但在这种特殊情况下,因为你总是循环 10 次,所以你根本不需要循环 - 你可以只使用 10 个空格的字符串:

char str[100];

strcpy(str, "          "); /* 10 spaces */

str[0] = '\0'; 是不必要的,因为我们现在使用的是strcpy,而不是strcat)。

【讨论】:

  • Nathan Campos:我回滚了您的编辑,因为编辑后的版本没有将目标作为有效字符串。
【解决方案2】:

C89 不支持在for 表达式的第一部分声明循环计数器。 C99 可以,但大多数编译器需要显式选项(-std=c99 用于 gcc)来打开它。做:

int i;
for ( i = 0; i < 10 ; ++i ) ...

另外,不要在字符指针中添加字符:)

【讨论】:

  • 他正在尝试将字符串添加到字符串指针。这不会连接 - 它会将指向 " " 的指针的实际值添加到指针 str 的值中。这也是有效的,因为const char* 是一个指向const char 的可变指针——我认为他的意思是使用char const str[11]
  • 将一个指针添加到另一个指针是无效的 - 指针运算被定义为 pointer + integer = pointerpointer - pointer = integer
【解决方案3】:

这里有两个问题

1) C89 标准不允许声明在循环内

for(int i = 0; i < 10; ++i)

应该是:

int i
for(i = 0; i < 10; ++i)

2) 您正在尝试添加两个指针值:

str += " ";

这里应该做什么取决于你想对字符串 str 做什么。

【讨论】:

  • 第 2 点不正确。这段代码有问题,但他没有改变常数。请检查您对指针的理解。
  • C99 确实允许在 for 循环中声明 int,您可能是指第 1 点中的 C89。
  • 是的。也解决了这个问题。谢谢。
【解决方案4】:

您显示的代码没有做任何有意义的事情。您可能会尝试做几件事:

我的第一个猜测是您正在尝试制作具有 10 个空格的字符串。为此:

char str[10];
int i;
for (i = 0; i < 10; i++)
{
  str[i] = ' ';
}

您可能要尝试做的第二件事是更改 char * 指向的位置。正如其他人指出的那样,由于您将其声明为 const,因此这将不起作用。但这是您的代码正在尝试做的事情,因此它失败了。如果您实际上是在尝试增加点指向的位置(通过空间的 ASCII 值的值),那么您需要使指针不恒定。

编辑:很好的收获。必须是单引号。

至于它不是一个字符串,因为它不是空终止的,我试图尽可能准确地预测 OP 试图做什么。如果要将其视为真正的字符串,则需要空终止,但我将其省略了,因为 OP 也这样做了。

【讨论】:

  • str[i] = " "; 行仍然不正确 - 也许您的意思是 str[i] = ' ';?然后,您仍然没有创建“字符串”,因为没有 nul 终止符(也没有空格)。
【解决方案5】:

您的代码有几处问题。

首先,您尝试使用不指向任何内容的char 指针构建字符串。使用chars 的数组或使用malloc 分配内存。然后,您在 for 循环中声明 int i。这不会在大多数编译器上编译。在 for 循环中使用它之前,您需要声明 i 。您也可以使用 gcc 使用 gcc --std=c99 test.c 编译它。之后,您尝试使用 + 运算符连接字符串。请记住,C 没有任何内置的字符串类型,因此没有为字符串连接定义 + 运算符(char*char[] 与 C++ 和 Java 中的字符串类不同,它们是仅用作字符串)。为此,您应该使用 string.h 中的 concat 函数。实际上,重复调用 concat 以在字符串末尾添加单个 char 并不是一个好主意,但那是另一回事了,当我们到达那里时,让我们越过那座桥:)。

阅读任何一本好 C 书籍中关于指针和字符串的章节可能是个好主意。这些事情的工作方式与您可能想象的略有不同。

【讨论】:

    【解决方案6】:

    如果您想循环/迭代您的 const char *str,请执行以下操作:

    const char *str;
    for (int i = 0; i < sizeof(str); i++)
    {
       doSomethingWith(str[i]);
    }
    

    【讨论】:

    猜你喜欢
    • 2012-01-14
    • 1970-01-01
    • 2016-09-14
    • 1970-01-01
    • 2012-08-14
    • 2013-02-06
    • 1970-01-01
    • 2016-12-23
    • 1970-01-01
    相关资源
    最近更新 更多