使用命令行从文本文件中读取数据到C混淆的数组中

时间:2014-10-30 16:52:06

标签: c arrays

我希望使用C。

将以下文件读入2D数组
AAAAAAAAAA
YYYYYYYYYY
AAAABAAAAA
XXXXXXXXXX

文件名是input4-10,我使用以下命令行运行程序:

./a.out 4 10 <input4-10

以下是该计划:

#include <stdio.h>
#include <stdlib.h>

int N=0;
int M=0;

int main(int argc, char **argv)
{
    if (argc!=3)
    {
        printf("Usage : pairwise numberOfSequences lengthOfSequences\n eg. pairwise 10000 50\n");
        exit(0);
    }
    sscanf(argv[1],"%d",&N);
    sscanf(argv[2],"%d",&M);

    char strings[N][M];
    int i,j;
    for (i=0; i<N; i++)
    {
        scanf("%s\n",strings[i]);
    }

    printf("[] %s\n",strings[0]);
    printf("[] %s\n",strings[1]);
    printf("[] %s\n",strings[2]);
    printf("[] %s\n",strings[3]);
}

但是当我把它打印出来时,我一直在说:

[] AAAAAAAAAAYYYYYYYYYYAAAABAAAAAXXXXXXXXXX
[] YYYYYYYYYYAAAABAAAAAXXXXXXXXXX
[] AAAABAAAAAXXXXXXXXXX
[] XXXXXXXXXX

这怎么会发生?在以下行scanf("%s\n",strings[i]);中究竟是什么被放入字符串[i]?整个罚款?我真的很困惑,我真的想要:

的字符串:

AAAAAAAAAA
YYYYYYYYYY
AAAABAAAAA
XXXXXXXXXX

作为2D数组,即:

strings = [A][A][A][A][A][A][A][A][A][A]
          [Y][Y][Y][Y][Y][Y][Y][Y][Y][Y]
          [A][A][A][A][B][A][A][A][A][A]
          [X][X][X][X][X][X][X][X][X][X]

等。任何帮助都会非常棒。

1 个答案:

答案 0 :(得分:1)

您的字符串不允许使用0终结符。试试这个:

char strings[N][M+1];

正在发生的是0终止符溢出到下一个字符串,然后由下一个字符串数据等覆盖。因此打印每个字符串也打印出更高的数组元素,因为唯一的0终结符是在结束之后最后一个字符串,可能超过j未使用。

话虽如此,您的代码仍然很危险,因为它不会检查用户是否输入的字符串比指定的长。通过创建一个动态限制输入长度的格式规范(printf使用的* length说明符在我的编译器中不起作用),可以防止字符串输入太长。前两个%符号是创建单个文本%,第三个%是%d的一部分,它使用您的字符串长度M.有两个\字符,因此文本“\ n”在字符串中逐字逐句,而不是换行符。

char spec[20];
sprintf (spec, "%%%ds\\n", M);   // create format spec as say "%10s\n"
//printf ("Spec %s\n", spec);      // print the spec just so you can see
for (i=0; i<N; i++)
    scanf(spec, strings[i]);