我希望使用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]
等。任何帮助都会非常棒。
答案 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]);