现在我正在尝试这个:
#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;
}
Run Code Online (Sandbox Code Playgroud)
这也不起作用:
char *source = "This is an example.";
int i;
for (i = 0; i < strlen(source); i++){
printf("%c", source[i]);
}
Run Code Online (Sandbox Code Playgroud)
我收到了错误
Test.exe中0x5bf714cf(msvcr100d.dll)的未处理异常:0xC0000005:读取位置0x00000054时发生访问冲突.
(从德语松散翻译)
那我的代码出了什么问题?
小智 55
你要:
for (i = 0; i < strlen(source); i++){
Run Code Online (Sandbox Code Playgroud)
sizeof给出指针的大小,而不是字符串.但是,如果您将指针声明为数组,它将起作用:
char source[] = "This is an example.";
Run Code Online (Sandbox Code Playgroud)
但是如果你将数组传递给函数,它也会衰减到指针.对于字符串,最好始终使用strlen.并注意其他人已经说过如何更改printf以使用%c.而且,考虑到mmyers对效率的评论,最好将调用移出strlen:
int len = strlen( source );
for (i = 0; i < len; i++){
Run Code Online (Sandbox Code Playgroud)
或重写循环:
for (i = 0; source[i] != 0; i++){
Run Code Online (Sandbox Code Playgroud)
Ale*_* C. 41
一个常见的习语是:
char* c = source;
while (*c) putchar(*c++);
Run Code Online (Sandbox Code Playgroud)
几点说明:
*c++递增c并返回取消引用的旧值c.printf("%s")打印以null结尾的字符串,而不是char.这是您违反访问权限的原因.小智 8
一种优化方法:
for (char character = *string; character != '\0'; character = *++string)
{
putchar(character); // Do something with character.
}
Run Code Online (Sandbox Code Playgroud)
大多数 C 字符串都是以 null 终止的,这意味着一旦字符变成 a,'\0'循环就应该停止。将*++string指针移动一个字节,然后取消引用它,然后重复循环。
之所以比它更有效,strlen()是因为 strlen 已经循环遍历字符串来查找长度,因此您实际上可以使用 . 循环两次(比需要的多一次)strlen()。
您可以只检查 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;
}
Run Code Online (Sandbox Code Playgroud)