在以下程序中,输出为BrownherAdamss。为什么没有正确的输出?与第二个程序一样,输出正确,因此对正在发生的事情感到困惑。两个程序都警告,但第二个程序运行良好。警告是ISO C ++禁止将字符串常量转换为'char'。 另外,如果我将指针数组声明为const,那么我将如何使用p [i] = client [i]。这让我很困惑。
第一个程序输出错误
#include<iostream>
using namespace std;
int main()
{
char *a[40]={"Davis","Levine","Nelson"};
char *client[10]={"Brown","Cohen","","","Fischer","Adams","","","Gibson"};
char *p[10];
int i;
for(i=0;i<8;i++)
{
p[i]=client[i];
}
char *pt;
int j=0;
for(i=0;i<10;i++)
{
pt=p[i];
while(*(pt+j)!='\0')
{
cout<<*(pt+j);
j++;
}
}
return 0;
}
输出正确的第二个程序
#include<iostream>
using namespace std;
int main()
{
char *p[30]={"Hello","World","HELLO","WORLD"};
int i,j;
char *a;
for(i=0;i<4;i++)
{
a=p[i];
j=0;
cout<<'\n';
while(*(a+j)!='\0')
{
cout<<*(a+j);
j++;
}
}
return 0;
}
答案 0 :(得分:0)
您不会在第一个程序中的每个字符串之间重置j
。只需在j=0;
之前添加while
。为什么这样显示完全像编译器那样,因为这种行为是不确定的。
该警告是因为字符串文字"Brown"
的类型为const char (&)[N]
,可以转换为const char*
,而不是char*
。如果将client
定义为const char* client[10]
,则将获得所需的行为(与a
和p
相同)。这样做会将它们定义为指向const char的指针数组。指针不是恒定的,只有字符是固定的,因此从client
复制到p
并不是问题。
顺便说一句,第一个程序中的client
仅提供了9个值。取消引用client[9]
将产生未定义的行为。