我正在学习C.在下面的代码中,为什么在for循环截断中用“ptr_str [i]”替换“* ptr_str”?
/* 13L01.c: Initializing strings */
#include <stdio.h>
main()
{
char str1[] = {'A', ' ',
's', 't', 'r', 'i', 'n', 'g', ' ',
'c', 'o', 'n', 's', 't', 'a', 'n', 't', '\0'};
char str2[] = "Another string constant";
char *ptr_str;
int i;
/* print out str2 */
for (i=0; str1[i]; i++)
printf("%c", str1[i]);
printf("\n");
/* print out str2 */
for (i=0; str2[i]; i++)
printf("%c", str2[i]);
printf("\n");
/* assign a string to a pointer */
ptr_str = "Assign a strings to a pointer.";
for (i=0; *ptr_str; i++)
printf("%c", *ptr_str++);
return 0;
}
答案 0 :(得分:2)
因为你推进ptr_str
然后将其作为一个数组处理并测试它是否指向第i个成员上的NULL
。您基本上是在测试ptr_str[i+i]
是NULL
而不是ptr_str[i]
。
答案 1 :(得分:2)
// A, ok
while (*ptr_str)
printf("%c", *ptr_str++);
// B, also ok
for (i=0; ptr_str[i]; i++)
printf("%c", ptr_str[i]);
// C, works but ugly
for (i=0; *ptr_str; i++)
printf("%c", *ptr_str++);
C是你的形式,它有缺陷,因为我在这里什么都不做,所以A是一个改进的版本。如果你想使用i,那么就像B一样。如果同时使用i和ptr_str,并在循环中增加它们,那么就不会有任何好处。增加一个或另一个。
答案 2 :(得分:1)
你的问题有点不清楚,但我想我已经明白了:
在下面的代码中,为什么在for循环截断中用“ptr_str [i]”替换“* ptr_str”?
我认为你的意思是改变这个:
for (i=0; *ptr_str; i++)
printf("%c", *ptr_str++);
return 0;
到此:
for (i=0; ptr_str[i]; i++)
printf("%c", *ptr_str++);
return 0;
第二个截断是因为您推进i
和 ptr_str
,因此修改后的起始位置为ptr_str
加上修改后的i
起始位置最终会过早地切断你(或者更糟糕的是,有一个奇数个字符并且溢出到不属于你的数据中)。截断的第二个例子相当于:
for (i=0; ptr_str[i * 2]; i++)
printf("%c", ptr_str[i]);
return 0;
现在你明白为什么会截断吗?