我有一个由 15 个字符串组成的数组(不一定全部都必须使用),尽管到处都读到 gets
永远不应该使用,但出于某种原因,我相信它是最方便的对于我来说这个计划。
在提示用户指定他想要的行数和列数以创建矩阵后,我要求他输入矩阵值,一次每行一行。我使用 gets
来完成此操作。同时,我想扫描字符串以查找输入的空格数量,以确保用户输入的数字数量与指定的列数量相对应。
最后我想打印出我输入的第二行。
您可以假设 rowone
和 colone
已经定义,我只是没有复制这部分代码以节省空间。
int i=0, rowone, colone, sbar=0, inputs=0;
char matrixone[15][10000];
......
printf("input your matrix\n");
for (i=0;i<rowone;i++){
gets(matrixone[i]);
while(matrixone[i][inputs]!='\n'){
if (mplier[i][inputs] == ' '){
sbar++;
inputs++;
}
else
inputs++;
}
if (sbar>=colone||sbar<colone-1){
printf("Too many/too few inputs per line\n");
main();
}
sbar = 0;
inputs = 0;
}
puts(matrixone[2])
我在编译时收到警告,最终甚至没有机会输入矩阵,因为总是弹出“太多/太少的输入”。
任何帮助将不胜感激,谢谢!
最佳答案
无限循环。
或者更准确地说,最终matrixone[i][inputs]
访问的内容远远超出了它所读取的范围,甚至可能超出了数组本身。这会导致未定义的行为 (UB)。
gets()
消耗,但不保存'\n'
。
gets(matrixone[i]);
while(matrixone[i][inputs]!='\n'){ // why should this quit?
...
inputs++;
}
相反,删除 gets()
因为它已经从语言中删除了 5 年,使用 fgets()
,检查返回值并查找结尾字符串也是如此
if (fgets(matrixone[i], sizeof matrixone[i], stdin) {
while(matrixone[i][inputs] != '\0'){
...
}
}
<小时/>
给OP的建议(猜测OP的目标)
char *matrixone[15] = { 0 };
printf("input your matrix\n");
for (i=0;i<min(rowone,15);i++){
buf[1000];
if (fgets( buf, sizeof buf, stdin) == NULL) break;
buf[strcspn(buf, "\n")] = 0;
// qualify buf concerning ' ' , sbar, etc
...
matrixone[i] = strdup(buf);
}
关于c - 如何使用gets读入字符串数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35675239/