一次复制并粘贴多行输入时,scanf会挂起

时间:2015-07-31 17:35:34

标签: scanf

这可能是一个简单的问题,但我是C的新手,却找不到任何答案。我的程序很简单,在for循环中需要21行字符串输入,然后打印出来。数量可能更少或更多。

int t = 21;
char *lines[t];
for (i = 0; i < t; i++) {
    lines[i] = malloc(100);
    scanf("%s", lines[i]);
}
for (int i = 0; i < t; i++) {
    printf("%s\n", lines[i]);
    free(lines[i]);
}
...

所以当我复制&amp;一次粘贴输入,我的程序挂起,没有错误,没有崩溃。如果只有20行或以下,那就没关系。如果我逐行手动输入,无论输入数量多少,它都能正常工作。

我在Mac OS X 10.10中使用XCode 5,但我认为这不是问题。

更新

我试图在程序挂起时调试它,它在下面一行的i == 20时停止: 0x7fff9209430a: jae 0x7fff92094314 ; __read_nocancel + 20

这个问题可能与scanf有关,但它很混乱,为什么数字20?可能是我以错误的方式使用它,非常感谢任何帮助。

更新

我尝试使用CLI gcc编译程序。它工作得很好。所以,最终是XCode的问题。不知何故,它会阻止用户粘贴多个输入。

2 个答案:

答案 0 :(得分:2)

如果要在C中读取字符串,请使用fgets,并查看有关该函数的文档:

[FGETS Function]

所以你应该像这样使用它:

var $el = $('#your-input-id');
$el.wrap('<form>').closest('form').get(0).reset();
$el.unwrap();

因此它会从用户的输入中获取字符串,您可以查看这两个帖子以及在C中读取字符串:

Post1

Post2

我希望这能帮助你解决问题。

修改:

fgets (lines[i],100,stdin);

此代码给出:

enter image description here

正如你所看到的,我得到了21个字符串(从0到20,这就是为什么它在i == 20时停止)。

我尝试了你的输入,结果如下:

enter image description here

答案 1 :(得分:0)

我写了相同的代码然后跑了。有用。 每行可能包含超过99个字符(包括换行符)... 或者它可能包含空格和制表符。

的scanf(3)

  

当格​​式字符串中出现一个或多个空白字符(空格,水平制表符\ t,垂直制表符\ v,换页符\ f,回车符\ r \ n,换行符或换行符\ n)时,输入数据到第一个读取非空白字符,或者直到不再有数据为止。如果输入数据中没有找到空格字符,则扫描完成,函数返回。

为避免这种情况,请尝试

scanf ("%[^\n]%*c", lines[i]);

整个代码是:

#include <stdio.h>

int main() {

    const int T = 5;
    char lines[T][100];  // length: 99 (null terminated string)
    // if the length per line is fixed, you don't need to use malloc.
    printf("input -------\n");
    for (int i = 0; i < T; i++) {
        scanf ("%[^\n]%*c", lines[i]);
    }
    printf("result -------\n");
    for (int i = 0; i < T; i++) {
        printf("%s\n", lines[i]);
    }

    return 0;
}

如果您仍然继续遇到问题,请向我们展示输入数据和更多详细信息。最好的问候。