如何迭代C中的字符串?

时间:2010-07-09 14:58:01

标签: c iteration

现在我正在尝试这个:

#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中0x5bf714cf(msvcr100d.dll)的未处理异常:0xC0000005:读取位置0x00000054时发生访问冲突。

(从德语翻译)

我的代码出了什么问题?

13 个答案:

答案 0 :(得分:53)

你想:

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++){

答案 1 :(得分:39)

一个常见的习语是:

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

一些注意事项:

  • 在C中,字符串为null-terminated。在读取的字符不是空字符时进行迭代。
  • *c++会增加c并返回c的已取消引用的值。
  • printf("%s")打印以null结尾的字符串,而不是char。这是您违反访问权限的原因。

答案 2 :(得分:3)

您可以只检查NULL字符,而不是像上面建议的那样使用strlen:

#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;
}

答案 3 :(得分:2)

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

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

答案 4 :(得分:2)

这应该有效

 #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]);

    }


 }

答案 5 :(得分:2)

  1. sizeof()包括终止空字符。你应该使用strlen()(但把调用放在循环之外并将其保存在变量中),但这可能不是造成异常的原因。
  2. 你应该在printf中使用“%c”,而不是“%s” - 你正在打印一个字符,而不是字符串。

答案 6 :(得分:1)

  • sizeof(source)将返回char*的大小,而不是字符串的长度。您应该使用strlen(source),并且应该将其移出循环,否则您将在每次循环时重新计算字符串的大小。
  • 使用%s格式修饰符进行打印时,printf正在寻找char*,但您实际上正在传递char。您应该使用%c修饰符。

答案 7 :(得分:0)

只需用strlen更改sizeof。

像这样:

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

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

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

}

答案 8 :(得分:0)

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

答案 9 :(得分:0)

您需要一个指向第一个char的指针才能拥有ANSI字符串。

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

将完成这项工作

另外,当然你的意思是strlen(source),而不是sizeof(source)

答案 10 :(得分:0)

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

下一步:

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

期待字符串。即%s期望字符串,但您在循环中迭代以打印每个字符。因此使用%c。

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

答案 11 :(得分:0)

C字符串的最后一个索引始终是整数值0,因此短语为“空终止的字符串”。由于整数0与C中的布尔值false相同,因此可以使用它为for循环创建一个简单的while子句。当它到达最后一个索引时,它将找到一个零并将其等同于false,从而结束for循环。

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

答案 12 :(得分:0)

一种优化的方法:

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

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

之所以比strlen()更有效,是因为strlen已经在字符串中循环查找长度,因此您实际上将使用strlen()循环两次(比所需时间多一倍)。