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}}。
我想知道我在编写代码时犯的错误或错误。
答案 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