用指针算术打印字符串
printing strings with pointer arithmetics
我正在尝试使用 rand() 打印随机单词。
我认为我在指针运算上犯了一个错误,因为我得到了一个奇怪的输出。
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
int main ()
{
srand(time(0));
const int randomBit = rand() % 2;
char * sz[] ={"good", "bad"};
switch (randomBit)
{
case 0:
for (char *i=*sz; *i<(sz+3); i++)
{
printf("%c", *i);
}
break;
case 1:
for (char *i=*(sz+3); *i!=0x0; i++)
{
printf("%c", *i);
}
break;
default:
break;
}
return 0;
}
我的错误是什么?
谢谢。
您的代码非常复杂(而且是错误的)。
这有什么问题:
int main()
{
srand(time(0));
const int randomBit = rand() % 2;
char* sz[] = { "good", "bad" };
printf("%s\n", sz[randomBit]);
return 0;
}
或者如果不允许您在作业中使用 %s
格式说明符:
for (char* i = sz[randomBit]; *i != 0; i++)
{
printf("%c", *i); // or putchar(*i);
}
鉴于此声明...
char * sz[] ={"good", "bad"};
...此代码具有未定义的行为:
for (char *i=*(sz+3); *i!=0x0; i++)
表达式*(sz+3)
等价于sz[3]
,但是数组sz
只有两个元素,所以最大索引为1。
同样,表达式 *sz
等价于 sz[0]
。那个在语义上还可以,但在风格上很差。同样,在风格上很差的是将两个单独的案例分开,而您可以通过使用 sz[randomBit]
到 select 要打印的字符串来用相同的代码覆盖两者。
此外,不清楚为什么要逐字符打印。也许这是作业的一部分,但在现实世界中,程序员可能会写...
printf("%s", sz[randomBit]);
... 而不是整个 switch
语句。
我正在尝试使用 rand() 打印随机单词。 我认为我在指针运算上犯了一个错误,因为我得到了一个奇怪的输出。
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
int main ()
{
srand(time(0));
const int randomBit = rand() % 2;
char * sz[] ={"good", "bad"};
switch (randomBit)
{
case 0:
for (char *i=*sz; *i<(sz+3); i++)
{
printf("%c", *i);
}
break;
case 1:
for (char *i=*(sz+3); *i!=0x0; i++)
{
printf("%c", *i);
}
break;
default:
break;
}
return 0;
}
我的错误是什么? 谢谢。
您的代码非常复杂(而且是错误的)。
这有什么问题:
int main()
{
srand(time(0));
const int randomBit = rand() % 2;
char* sz[] = { "good", "bad" };
printf("%s\n", sz[randomBit]);
return 0;
}
或者如果不允许您在作业中使用 %s
格式说明符:
for (char* i = sz[randomBit]; *i != 0; i++)
{
printf("%c", *i); // or putchar(*i);
}
鉴于此声明...
char * sz[] ={"good", "bad"};
...此代码具有未定义的行为:
for (char *i=*(sz+3); *i!=0x0; i++)
表达式*(sz+3)
等价于sz[3]
,但是数组sz
只有两个元素,所以最大索引为1。
同样,表达式 *sz
等价于 sz[0]
。那个在语义上还可以,但在风格上很差。同样,在风格上很差的是将两个单独的案例分开,而您可以通过使用 sz[randomBit]
到 select 要打印的字符串来用相同的代码覆盖两者。
此外,不清楚为什么要逐字符打印。也许这是作业的一部分,但在现实世界中,程序员可能会写...
printf("%s", sz[randomBit]);
... 而不是整个 switch
语句。