如何遍历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])
,因为你正在显示一个字符。
- sizeof()包含终止的空字符。 你应该使用strlen()(但是把这个调用放在循环之外并保存在一个variables中),但这可能不是导致exception的原因。
- 你应该在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)
。