C

时间:2015-08-19 18:20:51

标签: c arrays pointers gcc char

我的目标是循环一组预定义的字符串,同时在不使用计数器变量的情况下在每行上打印每个字符串。我已注释掉的行是工作代码,但需要一个计数器。它下方的四条线让我难过。

int main(int argc,char* argv[]){
    char *astring[500];
    astring[0]=(char*)"ABC";
    astring[1]=(char*)"DEF";
    astring[2]=(char*)"GHI";
    astring[3]=(char*)NULL;
    //long count;
    //for (count=0;count<4;count++){
    //printf("%s\n",astring[count]);
    //}
    char *p=*astring;
    while (*p++){
    printf("%s\n",*p);
    }
    return 0;
}

我尝试了以下变化但没有成功。

此代码:

    char *p=*astring;
    while (*p++){
    printf("%s\n",*p);
    }

编译正常,但在执行时,会发生分段错误错误,程序会立即退出。

我试过了:

    while (**p++){
    printf("%s\n",*p);
    }

,由于invalid type argument of 'unary *',程序无法编译。

然后我将char *p=*astring;更改为char *p=astring;并收到initialization from incompatible pointer type的警告

然后我还尝试了char *p=**astring;并收到了此编译器警告:initialization makes pointer from integer without a cast

我必须与明星混淆,或者我正在努力做不可能的事情?有没有人有解决方案?

3 个答案:

答案 0 :(得分:2)

# If checking if a User object is member of a @group
@user.member_of_group?(@group)
=> returns true or false

# If checking if a Group object has a member @user
@group.has_user_member?(@user)
=> returns true or false

答案 1 :(得分:2)

你可以写

for ( char **p = astring; *p; ++p ) puts( *p );

或者如果您的编译器不支持C99,则在声明数组

之后放置指针的声明
char *astring[500];
char **p;

//...

for ( p = astring; *p; ++p ) puts( *p );

如果您的数组包含T类型的元素,则表达式中使用的数组将转换为指向其第一个元素的指针。所以如果有声明

T array[N];

然后你可以写

T *p = array;

在你的程序中,你有一组char *类型的元素。因此T对应char *。你可以写

typedef char * T;
T astring[500];
T *p = astring;

p的类型为char **

考虑到无需申请施法

astring[0]=(char*)"ABC";
astring[1]=(char*)"DEF";
astring[2]=(char*)"GHI";
astring[3]=(char*)NULL;

你可以写

char *astring[500] = { "ABC", "DEF", "GHI"/*, NULL */ }; 

答案 2 :(得分:0)

我想出了一种方法:

int main(int argc,char* argv[]){
    char *astring[500]={"ABC","DEF","GHI","JKL",NULL};
    char **p=astring;
    while (*p != NULL){
    printf("%s\n",*p);
    *p++;
    }
    return 0;
}