c - 在循环中使用 fgets() 获取输入

标签 c arrays fgets

我正在尝试使用 fgets() 获取输入。我知道我会得到多少行,但它发生了变化,我将行数存储在变量 var 中。我还有另一个名为 part 的变量;它是我得到的行的长度,但由于值之间有空格,我将其乘以 2(我找不到其他解决方案;我可以使用一些建议)。

无论如何,我尝试按照下面的代码获取输入,但是当我输入第一行时,它会自动打破 for 循环并打印随机内容。我认为这与循环中的fgets()有关;我不知道是否有像这样使用fgets()

char inp[var][(2*part)];
int k,l;
for(k=0;k<=var;k++);
    fgets(inp[k],(2*part),stdin);
printf("%c\n",inp[0]);
printf("%c\n",inp[1]);
printf("%c\n",inp[2]);
printf("%c\n",inp[3]);

最佳答案

…since there are white spaces between the values I multiplied it with 2…

如果不需要将所有内容存储在堆栈上,则可以将字符串存储在动态分配的内存中。例如:

char* inp[var];
char buf[400]; // just needs to be long
for (k = 0; k < var;  k++) {
    fgets(buf, 400, stdin);
    inp[k] = malloc(sizeof(char) * (strlen(buf) + 1));
    strcpy(inp[k], buf);
}

虽然在技术上不符合标准,但 strdup 已广泛使用,并且也使这变得更容易。

就实际问题而言,正如 BLUEPIXY 在上面的评论中所说,您有一些拼写错误。

  1. 在 for 循环之后,分号使其表现出意外。

    for(k=0;k<=var;k++);
        fgets(inp[k],(2*part),stdin);
    

    实际上是一样的

    for(k=0;k<=var;k++) {
        ; // do nothing
    }
    fgets(...);
    

    删除 for 循环语句后面的分号。事实上,您实际上没有正确阅读,这就是您看到垃圾的原因。

  2. 要打印整个字符串,printf 系列需要 %s 格式标志。

  3. 当您的边界为 k 时,实际上会有 var + 1 次循环迭代。如果 var3,则 k = 0,1,2,3 -> 在检查 k 时终止4

关于c - 在循环中使用 fgets() 获取输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43813594/

相关文章:

c - 当http header错误报告content-length时该怎么办

java - 对具有两个不同对象的数组进行排序

arrays - Powershell 测试数组是否在一行中

c - 在 C 中使用 "gets"作为字符串输入

c - sscanf 格式警告

android - Tizen 蓝牙 SPP 接收数据但发送时 BT_ERROR_PERMISSION_DENIED

c - 在 udp 服务器中实现并发

c - gdb:为 SIGBUS 处理程序设置断点

c++ - 如何修改我的 C++ 程序以使用堆栈向后显示用户输入的单词?

c - feof 过早变为真