试图采取多个字符串输入

时间:2014-09-04 05:20:25

标签: c string dynamic-memory-allocation realloc

Practice.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define ARR 32

int main(void){

  int MEM=64;
  char arr[ARR],*p=(char *)calloc(MEM,(sizeof(char))),*q=NULL;
  int i=0,j=1;

  printf("\nEnter String : ");

  while(j){

    scanf(" %[^\n]s " ,arr);

    if(j==1)
      strcpy(p,arr);
    else
      strcat(p,arr);


    if((j*ARR)==MEM){
      MEM=MEM+(j*ARR);
      q=realloc(p, MEM);
      if(!(q)){
        printf("\nNOT ENOUGH MEMORY\n");
        goto END;
      }
      p=q;
    }


    for(i=0;i<(strlen(arr));++i){
      if(arr[i]=='\n')
        break;
    }


    if(arr[i]=='\n')
      break;


    ++j;
  }

  printf("\n %s\n",p);


  END: free(p);p=NULL;q=NULL;

  return 0;
}

  

我正在尝试获取多个字符串输入。

我使用scanf(" %[^\n]s",arr);来取代fgets(arr,ARR,stdin);而不是fgets,因为ENTER key scanf(" %[^\n]s",arr);,只要我点击while() loop,程序执行就会停止。但是使用\n,即使在输入{{1}}后,该程序也无法退出{{1}}。

我想知道我在编写代码时犯的错误或错误。

2 个答案:

答案 0 :(得分:2)

在C中读取多行输入的规范方法是在循环中使用fgets,例如

while (fgets(arr, sizeof(arr), stdin) != NULL)
{
    if (arr_contains_special_input_to_exit_loop(arr))
        break;

    // Optionally check for and remove trailing newline from input

    // Append `arr` to your data
}

退出循环的条件可能是某些特殊输入或空行或其他完全。

答案 1 :(得分:1)

一个错误是:

for(i=0;i<(strlen(arr));++i){
  if(arr[i]=='\n')
    break;
}

在您的代码中更早看到:

scanf(" %[^\n]s " ,arr);

[^\n]阻止\n中包含任何换行符arr。因此,寻找(arr[i]=='\n')的循环永远不会找到任何东西。您的下一部分代码将继续寻找不存在的newlines

if(arr[i]=='\n')
  break;

这最后一个break也会突破你的外循环,阻止你在寻找换行符时要求进一步输入(不应该这样做)。修复这些问题,它应该会进一步允许您输入多个项目。


修改

通过一些努力看看你在做什么,我现在有了多次输入并根据需要重新分配。字符串全部连接并在末尾打印。它仍然可以做一些工作,但这应该给你一些提示:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define ARR 32

int main (void) {

    int MEM = 64;
    char arr[ARR], *p = (char *) calloc (MEM, (sizeof (char))), *q = NULL;
    int i = 0, j = 1;


    while (j) {

        printf ("\nEnter String : ");
        scanf (" %[^\n]s ", arr);
        printf (" you entered (arr): %s\n", arr);
        if (strcmp (arr, "q") == 0) {
            printf ("\n  'q' entered, exiting.\n\n"); // provide for exit if `q` entered
            break;
        }

        if (j == 1)
            strcpy (p, arr);
        else
            strcat (p, arr);

        if ((j * ARR) == MEM) {
            MEM = MEM + (j * ARR);
            q = realloc (p, MEM);
            if (!q) {
                printf ("\nNOT ENOUGH MEMORY\n");
                goto END;
            }
            else
                printf ("\nMemory Reallocation - succeeded.\n");
            p = q;
        }
        ++j;
    }

    printf (" %s\n", p);

END:
    if (p) free (p);  /* always test pointer before calling free */
    p = NULL;
    q = NULL;

    return 0;
}

<强>输出:

./bin/me

Enter String : fishinsea
  you entered (arr): fishinsea

Enter String : alligators
  you entered (arr): alligators

Memory Reallocation - succeeded.


Enter String : really_big_mosters
  you entered (arr): really_big_mosters

Enter String : SuperSnake_Prudhome
  you entered (arr): SuperSnake_Prudhome

Memory Reallocation - succeeded.

Enter String : 8_puppies
  you entered (arr): 8_puppies

Enter String : q
  you entered (arr): q

  'q' entered, exiting.

fishinseaalligatorsreally_big_mostersSuperSnake_Prudhome8_puppies