如何遍历C中的string?

现在我正在尝试这个:

#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)未处理的exception:0xC0000005:在位置0x00000054处读取时出现访问冲突。

(从德文松散地翻译)

那么我的代码有什么问题?

你要:

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

sizeof给你指针的大小,而不是string。 但是,如果你已经将指针声明为一个数组,它将会起作用:

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

但是如果你传递数组来运行,那也会衰减到一个指针。 对于string,最好总是使用strlen。 并注意别人怎么说改变printf使用%c。 而且,考虑到效率对效率的评论,最好将呼叫转移到strlen之外:

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

或者重写循环:

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

一个常见的成语是:

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

一些注意事项:

  • 在C中,string以null结尾 。 读取字符不是空字符时进行迭代。
  • *c++递增c并返回c旧的取值。
  • printf("%s")打印一个以空字符结尾的string,而不是char。 这是您的访问冲突的原因。

sizeof(source)返回指针char*所需的字节数。 你应该用strlen(source)replace它,这将是你要显示的string的长度。

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

  1. sizeof()包含终止的空字符。 你应该使用strlen()(但是把这个调用放在循环之外并保存在一个variables中),但这可能不是导致exception的原因。
  2. 你应该在printf中使用“%c”而不是“%s” – 你正在打印一个字符,而不是一个string。

而不是像上面build议的那样使用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; } 
  • sizeof(source)返回给你一个char*的大小,而不是string的长度。 你应该使用strlen(source) ,你应该将其移出循环,否则你将在每个循环中重新计算string的大小。
  • 通过使用%s格式修饰符进行打印, printf正在查找char* ,但是实际上正在传递一个char 。 你应该使用%c修饰符。

这应该工作

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

用strlenreplacesizeof,它应该可以工作。

当source被声明为char *时, sizeof(source)返回一个指针的sizeof。 使用它的正确方法是strlen(source)

下一个:

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

期望string。 即%s期望string,但是你正在循环迭代打印每个字符。 因此使用%c。

但是,使用索引i访问(迭代)string的方式是正确的,因此没有其他问题。

只要用strlen改变sizeof即可。

喜欢这个:

 char *source = "This is an example."; int i; for (i = 0; i < strlen(source); i++){ printf("%c", source[i]); } 

你需要一个指向第一个字符的指针来使用ANSIstring。

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

会做这项工作

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