我有一个由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])我在编译时收到警告,最终甚至没有机会输入矩阵,因为“输入太多/太少”总是弹出的。
任何帮助都将不胜感激,谢谢!
发布于 2016-02-28 05:01:39
无限循环。
或者更确切地说,最终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);
}https://stackoverflow.com/questions/35675239
复制相似问题