c - 如何使用gets读入字符串数组?

标签 c arrays string matrix gets

我有一个由 15 个字符串组成的数组(不一定全部都必须使用),尽管到处都读到 gets 永远不应该使用,但出于某种原因,我相信它是最方便的对于我来说这个计划。 在提示用户指定他想要的行数和列数以创建矩阵后,我要求他输入矩阵值,一次每行一行。我使用 gets 来完成此操作。同时,我想扫描字符串以查找输入的空格数量,以确保用户输入的数字数量与指定的列数量相对应。

最后我想打印出我输入的第二行。

您可以假设 rowonecolone 已经定义,我只是没有复制这部分代码以节省空间。

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/

相关文章:

javascript - 如何使用 swift3 从 alamofire 响应中获取字典数组的值

C++:使用 std::string (&str[0]) 作为缓冲区从文件中安全读取?

C# forwardonly string.replace

c - 如何为 Windows 创建可执行 C 文件

c - C 中的字符串比较函数

c - 如何在c中的循环中将一个字符数组中的字符分配给另一个字符数组?

c# - 部分 BindingList 到字符串数组

c++ - 为什么在 C++ 中使用宏被认为是错误的? C++标准库的使用和使用

c - 如何知道用户是 root 还是 fakeroot?

c - 字符串的排列