如何输入多个字符串后跟换行符

时间:2014-04-07 07:28:03

标签: c string

这个程序询问用户想要输入多少字符串然后它需要所有字符串并存储它。每个字符串后跟换行符,表示正在输入新字符串。

#include<stdio.h>

int main()
{
    int n,i;
    char str[20];

    scanf("%d",&n); //how many string

    //input each string
    for(i=0;i<n;i++)
    {
        scanf("%s",&str[i]);
    }

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

    return 0;
}

我面临两个问题 首先,每当我在输入字符串程序崩溃后编译并在devc ++中运行它 第二,我只是想知道我上面做的是对的吗?

5 个答案:

答案 0 :(得分:2)

你想要的是一个2D字符数组,它实际上是一个字符串数组:

#include<stdio.h>
int main()
{
int n,i;
char str[20][20]; // Can store 20 strings, each of length 20

scanf("%d",&n); //how many string

//input each string
for(i=0;i<n;i++)
{
   scanf("%s",str[i]);
}

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

return 0;
}

上面的代码运行正常。我对原始代码所做的更改是:

  • 将str声明为2D字符数组,如上所述,它实际上是一个字符串数组。
  • 删除了&amp;来自str [i]之前。一个&amp;当scanf用于读取字符串时不需要
  • 在打印每个字符串后添加一个换行符,使其看起来更像输入代码

答案 1 :(得分:1)

char str[20]声明一组20个字符而不是20个字符串。

代码中的以下循环将写入从str开始的第一个字符串,然后写入从str + 1开始的第二个字符串,这将覆盖第一个字符串的第二个和后续字符你写的字符串。

//input each string
for(i=0;i<n;i++)
{
    scanf("%s",&str[i]);
}

您的程序段错误的原因是,在以下行%s中需要一个字符串(char*),但您传递的是char

printf("%s",str[i]);

以下是代码的固定版本,它应该支持系统具有内存的字符串。

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


#define MAX_STRING_SIZE 1024
int main()
{
    int n,i;
    char ** str;

    scanf("%d",&n); //how many string

    // Allocate enough memory to store the number of strings requested
    str = malloc(n * sizeof(char*));
    for (i = 0; i < n; i++) {
        str[i] = malloc((MAX_STRING_SIZE + 1) * sizeof(char));
        memset(str[i], 0, MAX_STRING_SIZE + 1);
    }

    //input each string
    for(i=0;i<n;i++)
    {
        scanf("%s", str[i]);
    }

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

    // Free the memory we allocated
    for (i = 0; i < n; i++) 
        free(str[i]);
    free(str);

    return 0;
}

答案 2 :(得分:1)

在你的代码中str是一个包含20个字符的数组。但是你需要一个20个字符串的数组,比如100个字符。

如果你写:

char str[20][100];

你的程序会运作。

您现在最多可以输入20个字符串,每个字符串的长度最多为100个字符,终止为零。

答案 3 :(得分:0)

更好的方法是动态分配内存。

#include <stdio.h>

int main()
{
   int n,i;
   char** str;

   scanf("%d", &n);
   str = (char**)malloc(sizeof(char*)*n);

   for(i=0; i<n; i++)
   {
      str[i] = (char*)malloc(100); // assuming the strings will not be more than 100 chars long.
      scanf("%s", &str[i]);
   }

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

答案 4 :(得分:0)

我不认为你理解C中字符串的概念。 在C(和C ++)中,字符串只是一个以NULL结尾的字符数组(ASCII值为-0)。 当您声明char str[20];时,您只声明了一个包含19个字符的字符串的字符串(因为NULL占用了字符串的1个字符)。如果你想声明一个字符串数组,你应该做一些像char strs[20][100];这样的2D字符数组 - 在我们的例子中 - 是一维字符串数组。它可能包含20个字符串,大小为99个字符+ NULL或100个字符串,大小为19个字符+ NULL - 取决于您希望它的方式(通常您会将其视为20个字符串大小为99 + NULL)。 第scanf("%s", str[i]);行实际上是从字符串中提到的位置开始输入,并以null结束。

char str[20];
scanf("%s", str);

(注意 - 如果它是第一个点 - 不需要&amp;运算符)输入&#34; banana&#34;将以spot中的NULL结束[6](因为字符串和数组从0变为声明为-1的大小)。 但是:

scanf("%s", &str[4]);
例如

- 输入将从第5个点([4])开始,结束取决于输入。如果您使用此scanf,那么您可能在str [0]到str [3]中有垃圾值,因为您没有在其中执行任何操作。 不要让名字混淆你 - char str [20] - 只有一个字符串,大小为19个字符+ NULL。 正确的方法是:

char str[20][20]; //20 strings with the size of 19 character + NULL
int i, n;
printf("Enter the number of strings you want to enter: ");
scanf("%d", &n);
for(i = 0 ; i < n ; i++)
{
scanf("%s", &str[i]);
}

就是这样。 我希望我帮助过。)