如何在 C 中迭代一个字符串?

现在我正在尝试这个:

#include <stdio.h>


int main(int argc, char *argv[]) {


if (argc != 3) {


printf("Usage: %s %s sourcecode input", argv[0], argv[1]);
}
else {
char source[] = "This is an example.";
int i;


for (i = 0; i < sizeof(source); i++) {


printf("%c", source[i]);
}
}


getchar();


return 0;
}

这也不起作用:

char *source = "This is an example.";
int i;


for (i = 0; i < strlen(source); i++){


printf("%c", source[i]);
}

我知道错了

Test.exe: 0xC0000005中0x5bf714cf (msvcr100d.dll)处的未处理异常: 读取位置为0x0000054时的访问冲突。

(粗略翻译成德语)

我的代码有什么问题吗?

307973 次浏览

用 Strlen 改变大小。

像这样:

char *source = "This is an example.";
int i;


for (i = 0; i < strlen(source); i++){


printf("%c", source[i]);


}

你想要:

for (i = 0; i < strlen(source); i++) {

Sizeof 给出的是指针的大小,而不是字符串的大小。但是,如果将指针声明为数组,它就会工作:

char source[] = "This is an example.";

但是如果你将数组传递给函数,它也会衰减为一个指针。对于字符串,最好始终使用 strlen。注意其他人说的关于将 printf 更改为使用% c 的内容。同时,考虑到 mmyers 对效率的评论,最好将 strlen 调用移出循环:

int len = strlen(source);
for (i = 0; i < len; i++) {

或者重写循环:

for (i = 0; source[i] != 0; i++) {

sizeof(source)返回指针 char*所需的字节数。您应该将其替换为 strlen(source),它将是您试图显示的字符串的长度。

另外,您可能应该用 printf("%c",source[i])替换 printf("%s",source[i]),因为您正在显示一个字符。

用 strlen 替换 size,应该可以工作。

您需要一个指向第一个字符的指针来获得 ANSI 字符串。

printf("%s", source + i);

会完成任务的

另外,当然你应该指的是 strlen(source),而不是 sizeof(source)

这个应该可以

 #include <stdio.h>
#include <string.h>


int main(int argc, char *argv[]){


char *source = "This is an example.";
int length = (int)strlen(source); //sizeof(source)=sizeof(char *) = 4 on a 32 bit implementation
for (int i = 0; i < length; i++)
{


printf("%c", source[i]);


}




}
  • 返回的是 char*的大小,而不是字符串的长度。您应该使用 strlen(source),并且应该将它移出循环,否则每个循环都将重新计算字符串的大小。
  • 通过使用 %s格式修饰符打印,printf正在寻找一个 char*,但实际上传递的是一个 char。您应该使用 %c修饰符。
  1. Sizeof ()包含终止空字符。您应该使用 strlen ()(但是将调用放在循环之外并将其保存在一个变量中) ,但是这可能不是导致异常的原因。
  2. 您应该在 printf 中使用“% c”,而不是“% s”——您打印的是字符,而不是字符串。

一个常见的成语是:

char* c = source;
while (*c) putchar(*c++);

一些注意事项:

  • 在 C 语言中,字符串是 无效。当读取字符不是空字符时进行迭代。
  • *c++递增 c并返回取消引用的 老了c
  • ABc0打印的是空终止字符串而不是字符这就是导致访问权限受到侵犯的原因。

不用像上面建议的那样使用 strlen,只需检查 NULL 字符:

#include <stdio.h>


int main(int argc, char *argv[])
{
const char *const pszSource = "This is an example.";
const char *pszChar = pszSource;


while (pszChar != NULL && *pszChar != '\0')
{
printf("%s", *pszChar);
++pszChar;
}


getchar();


return 0;
}

当源声明为 char * 时,sizeof(source)返回指针的大小。 正确的使用方法是 strlen(source)

下一步:

printf("%s",source[i]);

例如% s 需要字符串,但是您在循环中迭代以打印每个字符,因此使用% c。

然而,使用索引 i 访问(迭代)字符串的方法是正确的,因此没有其他问题。

C-String 的最后一个索引总是整数值0,因此短语“以 null 结尾的字符串”。由于整数0与 C 中的 Boolean 值 false 相同,因此可以使用它为 for 循环创建一个简单的 while 子句。当它到达最后一个索引时,它会找到一个零并将其等同为 false,结束 for 循环。

for(int i = 0; string[i]; i++) { printf("Char at position %d is %c\n", i, string[i]); }

优化方法:

for (char character = *string; character != '\0'; character = *++string)
{
putchar(character); // Do something with character.
}

大多数 C 字符串以 null 结尾,这意味着一旦字符变成 '\0',循环就应该停止。*++string将指针移动一个字节,然后解除引用,循环重复。

之所以这比 strlen()更有效,是因为 strlen 已经循环遍历字符串以查找长度,所以实际上使用 strlen()循环两次(多一次)。

这是11岁,但相关的人谁是学习 C 我不明白为什么我们有所有这些讨论和分歧的东西,这么根本。C 语言中的字符串文字,例如“文本在引号之间”在最后一个字符之后有一个隐式的空结束符。别被这个名字迷惑了。空终止符等于数字0。它的目的正是 OP 所需要的:

char source[] = "This is an example.";


for (int i = 0; source[i]; i++)
printf("%c", source[i]);

C 中的 char 是一个8位整数,其中包含相应字符的数字 ASCII 值。这意味着 source [ i ]是一个正整数,直到 char [19] ,它是 final’后面的 null 结束符空字符是 ASCII 0。这就是循环结束的地方。循环遍历每个字符,而不考虑数组的长度。