[英]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.