【发布时间】:2016-11-28 04:29:29
【问题描述】:
我编写了一个小代码来获取多个字符串作为用户的输入。在此之前,我要求用户输入要作为输入的字符串数。以字符串为输入时,换行符自动占据第一个字符串的位置。我不知道发生了什么:(这是我的代码:
#include<stdio.h>
#include<string.h>
void main()
{
char *arr[20],str[40];
int n;
printf("enter the number of strings\n");
scanf("%d",&n);
int i;
printf("Enter the strings\n");[It isn't taking 3 strings as input,as a newline character is already occupying first place][1]
for(i=0;i<n;i++)
{
gets(str);
arr[i]=(char *)malloc(sizeof str);
strcpy(arr[i],str);
}
printf("The Strings are:\n");
for(i=0;i<n;i++)
{
printf(arr[i]);
printf("\n");
}
}
【问题讨论】:
-
从不,从不使用
gets。由于不安全,它已从 C11 中删除。请改用fgets(例如fgets (str, sizeof str, stdin))。您的问题的答案是gets和fgets(和getline)都读取直到并包括'\n'。您通常会在存储字符串之前将其删除(例如,size_t len = strlen (str); if (str[len-1] == '\n') str[len-1] = 0;,因此您的某些变量不会有换行符),但如果您只是打印回stdout,请不要添加'\n'在您的printf声明中。 -
另外,NOT 转换
malloc的返回值,这是不必要的。有关详细说明,请参阅:Do I cast the result of malloc?。 -
是的,你是对的,fgets 绝对比 gets 更安全,因为它缓解了缓冲区溢出问题。那么,在我将字符串数量作为输入之后,换行符已经在输入缓冲区中等待了吗?并且在读取第一个字符串时,它会在缓冲区中看到一个换行符并将其作为第一个字符串?
-
由于
arr[i]的内容是由用户定义的,使用printf(arr[i]);是非常不安全的。用户可以在其中键入各种带有%的内容并破坏您的程序。%245n很可能会导致崩溃。使用printf("[%s]\n", arr[i]);或类似的方式,让自己有机会查看数据。方括号分隔字符串以帮助您查看前导和尾随空格(以及 CR 字符等)。