2
int main(int argc, char const *argv[])
{
    char str[100][100];
    int n, i;

    scanf("%d", &n);

    for (i = 0; i < n; i++)
        gets(str[i]);

    for (i = 0; i < n; i++)
        printf("%s\n",str[i]);
}

为什么我无法正确读取字符串?

raja@raja-Inspiron-N5110:~/myctry$ ./a.out
2     
abc def

abc def
4

7 回答 7

2

改变

scanf("%d",&n);

scanf("%d\n",&n);

如果您按回车键输入您的号码。这种形式在 scanf() 时去掉了 str[1] 中的 '\n'。

于 2013-07-19T13:49:58.567 回答
2

永远不要使用gets()。因为在事先不知道数据的情况下不可能知道gets()会读取多少个字符,而且因为gets()会继续存储超过缓冲区末尾的字符,所以使用起来非常危险。它已被用来破坏计算机安全。请改用 fgets()。

男人

于 2013-07-19T13:34:39.233 回答
2

您正在使用基于 1 的索引。C 使用基于 0 的索引。

for将循环更改为for(i=0;i<n;i++)

于 2013-07-19T13:18:15.247 回答
0
#include<string.h>
#include<stdio.h>
int main()
{
    int n,i;
    char str[100][100];
    scanf("%d", &n);

        for(i=0;i<n;i++)
        {gets(str[i]);}

         for(i=0;i<n;i++)
        {printf("%s\n",str[i]); }

    return 0;
}
于 2013-07-19T13:29:19.897 回答
0

从索引开始循环0- 你从 1 开始

for (i = 0; i <= n; i++)

此外,您还应该打印字符串。

于 2013-07-19T13:28:52.017 回答
0

正如 7-isnotbad 所说,gets() 并不安全,fgets() 是更好的选择。

get() 和 fgets() 都从缓冲区读取以 '\n' 结尾的行。

也许你可以试试这段代码:

#include "stdio.h"

#define MAX_LINE 1024
#define MAX_ROW  100
int main()
{
    char  str[MAX_ROW][MAX_LINE];
    int i,n;
    printf("input the row of lines :\n");
    scanf("%d\n",&n);
    if(n < 1)
    {printf("input error!\n");return -1;}
    for(i = 0; i < n; ++i)
        fgets(str[i],MAX_LINE - 1,stdin);
    for(i = 0; i < n; ++i)
        fputs(str[i],stdout);
    return 0;
}
于 2013-07-19T14:42:14.500 回答
0

有几个问题:

  1. 您需要在索引 0 处开始 for 循环。
  2. 你应该把你的字符串打印出来

int main(int argc, char const *argv[])
{
    char str[100][100];
    int n,i;
    scanf("%d",&n);
    for(i=0;i<n;i++) // start at i = 0
        gets(str[i]); // store string to str[0]
    printf("%s\n", str[0]); // print the results

}
于 2013-07-19T13:20:01.900 回答