繁体   English   中英

c,为什么我不能打印数组的所有元素

[英]c, why i can't print all elements of my array

我正在 c 中编写一个简单的程序,它打印数组的所有元素。 数组是

char op[2][50] = {"option1", "option2"};

该程序是

int main(int argc, char * argv[])
{
    char spaces[6] = "      ";
    int choice;
    char op[2][50] = {"option1", "option2"};

    printf("\n\n\t=========== OPTIONS ===========\n\n\t");
    for (int i;i<sizeof(op)/sizeof(op[0]);i++) {printf("%s[%d]: %s\n\t",spaces,i+1,op[i]);}
    printf("\n\t\t%s[?]: ",spaces);
    scanf("%d",&choice);
    
    if (choice==1) {firstFunction();} //i've declared this function, but here isn't important

    return 0;
}

所以,问题是选项没有打印 output:

=========== VIDEO TOOLS ===========


               [?]:

问题本质上是 if 语句,因为我尝试上下添加其他 printf 并且它们可以工作。 此外,该 if 语句在对程序进行一些更改之前有效,因此问题可能出在其他代码行(?)

我是 c 的初学者,所以请不要公开复杂的解决方案。 谢谢

for (int i;i<sizeof(op)/sizeof(op[0]);i++)

您没有初始化i变量,它是未定义行为 (UB)

它应该是:

for (int i = 0;i<sizeof(op)/sizeof(op[0]);i++)

或更好(使用正确的大小和正索引类型)

for (size_t i = 0;i<sizeof(op)/sizeof(op[0]);i++)

打印size_t使用%zu格式

另外,请记住 C 字符串由 null 终止字符终止。 因此,您需要添加比字符串文字中看到的多一个字符。 (“123”需要 4 个字符) spaces数组太短,无法容纳" " char spaces[] = " ";

很多错误。 评论中提到的事情的总结:

  • i在未初始化时使用,将其设置为零。

  • char spaces[6] = " "; 太小,请参阅字符 arrays 应该如何用作字符串? .

  • 养成用\n结束printf 行而不是从它们开始的习惯。 因为\n不仅改变了行,它还可能刷新某些系统上的标准输出。 未能刷新标准输出可能会导致 output 以奇怪的顺序出现或 go 丢失。

此外,如果这些是只读字符串,则考虑使用一维指针数组,因为这样更灵活且 memory 高效:

const char* op[2] = {"option1", "option2"};

显式指定元素数量的此数组声明

char spaces[6] = "      ";

容易出错。 该数组不包含字符串,因为用作初始值设定项的字符串文字的终止零字符'\0'未存储在数组spaces中。 字符串文字的大小等于7而不是6

所以写起来更安全

char spaces[] = "      ";

或者因为您不打算更改数组,所以最好写

const char *spaces = "      ";

在这个二维数组的声明中

char op[2][50] = {"option1", "option2"};

您明确指定该数组包含两个元素。 所以使用表达式i<sizeof(op)/sizeof(op[0])没有多大意义。

要么引入一个命名常量,要么引入 fefor 数组的声明,例如

enum { N = 2 };
char op[N][50] = {"option1", "option2"};

然后使用表达式

i < N

在 for 循环中。 或者像这样声明数组

char op[][50] = {"option1", "option2"};

并在声明之后引入一个命名常量,如

const size_t N = sizeof( op )/sizeof( op[0] );

并在 for 循环中使用常量,顺便说一下您忘记初始化变量 i

for ( size_t i = 0; i < N; i++ ) 
{
    printf("%s[%zu]: %s\n\t",spaces,i+1,op[i]);
}

由于变量 i 现在具有 size_t 类型,因此您必须在printf的调用中使用转换说明符%zu而不是%d

重写这段代码会更安全

scanf("%d",&choice);

if (choice==1) {firstFunction();} //i've declared this function, but here isn't important

以下方式

if ( scanf("%d",&choice) == 1 && choice==1 ) 
{
    firstFunction();
} //i've declared this function, but here isn't important

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM