gpt4 book ai didi

c - 将多个字符串作为输入时出现不必要的换行符

转载 作者:行者123 更新时间:2023-11-30 15:03:05 24 4
gpt4 key购买 nike

我编写了一段小代码来获取多个字符串作为用户的输入。在此之前,我要求用户输入要作为输入的字符串数量。当以字符串作为输入时,换行符会自动占据第一个字符串的位置。我不知道发生了什么:(这是我的代码:

#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");
}
}

最佳答案

根据评论,您的代码中存在许多问题。首先获取,不要使用它,这是一种“悬而未决”的进攻——说得够多了。

接下来,验证所有用户输入。据您所知,猫可能会踩键盘。确保测试收到的输入内容,并确保它符合您的预期。

scanf面向行的输入(例如 fgetsgetline)混合可能会给新用户带来问题。为什么?scanf 系列函数不会删除 '\n' 而是将其保留在输入缓冲区中(例如 stdin)。然后,您尝试使用 fgets 读取它在 stdin 中看到的第一个字符是什么?'\n',它读取并认为是一个整行。如果您要使用 scanf 读取字符串的数量,则需要删除 scanf'\n' code> 留在 stdin 中。

这并不难,实际上您可以在格式字符串中使用 scanf 提供的赋值抑制运算符。例如:

scanf ("%d%*c", &n);

* 是赋值抑制运算符,当与 %*c 一起使用时,它只是告诉 scanf 读取并丢弃/em> 下一个字符不添加到匹配计数(例如scanf返回的内容)。

在填充数组时,您将需要使用 while 循环而不是 for 循环(或使用独立索引)。为什么?如果用户使用ctrl + d(或windoze上的ctrl + z)取消输入会怎么样。如果无论用户做什么都迭代到 n,您可以轻松地尝试索引尚未分配的数组元素,或分配未输入的字符串。

总而言之,您可以执行以下操作:

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

enum { MAXA = 20, MAXS = 40 }; /* max ptrs and str */

int main (void) {

char *arr[MAXA] = {NULL}, str[MAXS] = "";
int i = 0, n = 0, ndx = 0; /* initialize all variables */

printf ("enter the number of strings: ");
/* use assignment suppression %*c to discard the \n */
if (scanf ("%d%*c", &n) != 1) { /* always validate input */
fprintf (stderr, "error: invalid integer input.\n");
return 1;
}

if (n > MAXA) { /* validate the value of n */
fprintf (stderr, "warning: n > %d, using %d as limit.\n",
MAXA, MAXA);
n = MAXA;
}

printf("Enter the strings\n");
while (ndx < n && fgets (str, sizeof str, stdin)) { /* validate input */
size_t len = strlen (str); /* get the length */
if (str[len - 1] == '\n') /* check for '\n' */
str[--len] = 0; /* overwrite with nul-terminator */
if (!(arr[ndx] = malloc (len + 1))) { /* validate allocation */
fprintf (stderr, "error: virtual memory exhausted.\n");
break;
}
strcpy (arr[ndx], str); /* copy to array */
ndx++; /* increment index */
}

printf("\nThe Strings are:\n");

for (i = 0; i < ndx; i++) { /* you have ndx strings not n */
printf (" arr[%2d] : %s\n", i, arr[i]);
free (arr[i]); /* free memory when no longer needed */
}

return 0;
}

示例使用/输出

$ ./bin/nogets
enter the number of strings: 3
Enter the strings
My dog
has a lot
of fleas.

The Strings are:
arr[ 0] : My dog
arr[ 1] : has a lot
arr[ 2] : of fleas.

现在尝试同样的操作,然后按ctrl + d,而不是输入“of fleas。”(您已被覆盖)。

最后,在您编写的动态分配内存的任何代码中,对于分配的任何内存块,您都有 2 个责任:(1) 始终保留指向起始地址的指针> 对于内存块,(2) 当不再需要它时可以释放。养成跟踪分配的内存并释放它的习惯,而不是依赖它在退出时完成。当您的程序变得更加复杂时,这将对您很有帮助。

查看代码,确保您了解发生了什么。如果您有任何疑问,请告诉我。

关于c - 将多个字符串作为输入时出现不必要的换行符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40837206/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com