Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 循环常量字符_C_Loops_Char_Constants - Fatal编程技术网

C 循环常量字符

C 循环常量字符,c,loops,char,constants,C,Loops,Char,Constants,我需要循环一个常量char,我使用了一个简单的字符串循环示例: const char *str; for(int i = 0; i < 10; ++i) { str += " "; } const char*str; 对于(int i=0;i

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

const char *str;
for(int i = 0; i < 10; ++i)
{
   str += " ";
}
const char*str;
对于(int i=0;i<10;++i)
{
str+=”;
}
但当我试图编译时,我得到了:

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

我该怎么办?

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

int i;
for ( i = 0; i < 10 ; ++i ) ...
inti;
对于(i=0;i<10;++i)。。。

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

这里有两个问题

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

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

这里应该做什么取决于您正试图对字符串str执行什么操作。

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

我的第一个猜测是,你正在尝试创建一个有10个空格的字符串。为此:

char str[10];
int i;
for (i = 0; i < 10; i++)
{
  str[i] = ' ';
}
charstr[10];
int i;
对于(i=0;i<10;i++)
{
str[i]='';
}
您可能要做的第二件事是更改char*指向的位置。因为您将其声明为const,所以正如其他人所指出的,这将不起作用。但这正是您的代码试图做的,因此它失败的原因。如果您实际上试图增加点指向的位置(通过ASCII空格值的值),则需要使指针不是常量

编辑:接得好。需要是单引号


至于它不是一个字符串,因为它不是以null结尾的,所以我试图尽可能接近地预测OP试图做什么。如果要将其视为真字符串,则需要Null终止,但我忽略了这一点,因为OP也这样做了。

您的第一个错误是因为您执行了以下操作:

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, " ");
}

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

您的代码有几处错误

首先,您尝试使用不指向任何内容的
char
指针构建字符串。使用
char
s数组或使用
malloc
分配内存。然后,在for循环中声明
inti
。这在大多数编译器上无法编译。在for循环中使用i之前,需要声明i。您还可以使用gcc使用
gcc--std=c99 test.c
编译它。然后,尝试使用+运算符连接字符串。记住,C没有任何内置的字符串类型,因此不定义字符串连接的+运算符(A <代码> char *<代码>或<代码> char】[/COD>不是字符串,它们与C++和java中的字符串类相同,它们只是作为字符串使用)。为此,应使用
string.h
中的
concat
函数。事实上,反复调用
concat
在字符串末尾添加单个
char
不是一个好主意,但这是另一个故事,让我们在到达时跨越这座桥:)


在任何一本好的C语言书中,通读有关指针和字符串的章节可能是一个好主意。这些事情的工作原理可能与您的想法略有不同。

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

const char *str;
for (int i = 0; i < sizeof(str); i++)
{
   doSomethingWith(str[i]);
}
const char*str;
对于(int i=0;i
你问这个问题是为了好玩还是真的想得到严肃的回答?你的个人资料看起来不需要问这样的问题。个人资料表明他是C++新手。这段代码是你新操作系统的核心吗?内森是一个奇怪的混血儿,介于奈夫和巨魔之间。他在这里提出的问题如果不太认真(或者更好)的话,可以提供几个小时的天真的娱乐。第2点是不正确的。此代码有问题,但他没有更改常量。请回顾您对指针的理解。C99允许在for循环中声明int,您可能是指第1点中的C89。是的。也解决了这个问题。谢谢。行
str[i]=”仍然不正确-也许你的意思是
str[i]=''而不是?然后,您仍然没有创建“字符串”,因为没有nul终止符(也没有空格)。他正在尝试向字符串指针添加字符串。这不会连接-它会将指向
的指针的实际值添加到指针
str
的值中。它也是有效的,因为
const char*
是指向
const char
的可变指针-我认为他想使用的是
char const str[11]
将一个指针添加到另一个指针是无效的-指针算术定义为
pointer+integer=pointer
,和
pointer-pointer=integer
。Nathan Campos:我回滚了您的编辑,因为编辑的版本没有将目标作为有效字符串保留。请记住
const char*array
from strings可能以NUL字符结尾,用于终止字符串
“\0”
,因此,您的大小可能比可读字符的数量大1。
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, " ");
}
char str[100];

strcpy(str, "          "); /* 10 spaces */
const char *str;
for (int i = 0; i < sizeof(str); i++)
{
   doSomethingWith(str[i]);
}