现在我正在尝试这个:
#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时发生访问冲突。
(从德语翻译)
我的代码出了什么问题?
答案 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++
会增加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)
答案 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()
循环两次(比所需时间多一倍)。