【问题标题】:looping strings without for loop or counter in C在C中没有for循环或计数器的循环字符串
【发布时间】:2015-11-13 04:29:44
【问题描述】:

我的目标是循环通过一组预定义的字符串,同时在自己的行上打印每个字符串,而不使用计数器变量。我注释掉的行是工作代码,但需要一个计数器。它下面的四行把我难住了。

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

我一定是对星星感到困惑,还是我试图做的事情是不可能的?有人有解决办法吗?

【问题讨论】:

  • 为什么p 不被视为“计数变量”?
  • char *p=astring; 怎么样?还是char *p=&amp;(astring[0];
  • 为什么astring[0] = (char*)"ABC"; ... 有演员表?
  • @Mike 幸运的是,除非您有一个非常旧的系统,或者正在编写系统软件,否则应用程序段错误很少会使您的整个机器崩溃。其次,强制转换通常会降低代码的安全性,因为它们对编译器隐藏了信息。类型转换对编译器说“看,我知道它看起来像 X 类型,但假装它是 Y 类型”。通常编译器比程序员更了解它的类型。
  • 仅供参考,没有演员表和 const 正确性,see it live

标签: c arrays pointers gcc char


【解决方案1】:

你可以写

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 */ }; 

【讨论】:

  • 那个for循环给了我error: 'for' loop initial declaration used outside C99 mode消息
【解决方案2】:
char** p = astring;
while (*p != NULL){
    printf("%s\n", *p);
    p++;
}

【讨论】:

  • AlexD,我仍然收到分段错误
【解决方案3】:

我想出了一种方法:

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;
}

【讨论】:

  • 现在的问题是如何在没有段错误的情况下将该 p++ 合并到 while 循环中
  • 更改 *p++;到 p++;或++p;至于分段错误,那么程序是正确的。
猜你喜欢
  • 2020-01-22
  • 1970-01-01
  • 1970-01-01
  • 2017-08-31
  • 2022-01-03
  • 1970-01-01
  • 2010-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多