问题在于使用指针数组获取字符串输入x次。 x是用户输入的值。我为相同的代码编写了以下代码。但是该程序仅接受x-1输入。 我插入了fflush(stdin),因为我认为scanf首先消耗了enter,但是我不知道从哪里开始。
我尝试使用获取但没有用。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
//code to take input in an array of pointers
int x,i,j,length;
char ch[50],*t;
printf("How many names you want to sort:\n");
scanf("%d",&x);
char *names[x];
char *p;
printf("Enter the names:\n");
for(i=0;i<x;i++)
{
fflush(stdin);
scanf("%[^\n]s",ch);
length = strlen(ch);
p = (char *)malloc((length+1) * sizeof(char));
strcpy(p,ch);
names[i] = p;
}
return 0;
}
答案 0 :(得分:3)
为什么不必麻烦使用复杂格式的字符串?使用fgets
。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void err(const char * msg) {
fprintf(stderr, msg);
exit(1);
}
int main()
{
int x,i;
char ch[50];
printf("How many names you want to sort:\n");
if(!fgets(ch, 50, stdin)) err("Error reading line");
if(sscanf(ch, "%d",&x) != 1) err("Could not read integer");
// Better than using VLA
char **names = malloc(x*sizeof(*names));
if(!names) err("Error allocating names");
printf("Enter the names:\n");
for(i=0;i<x;i++) {
if(!fgets(ch, 50, stdin)) err("Error reading line");
ch[strcspn(ch, "\n")] = 0; // Remove newline
if(!(names[i] = strdup(ch))) err("Error duplicating string");
}
for(int i=0; i<x; i++)
printf("name %d: %s\n", i, names[i]);
}
只要函数的返回值可能指示错误,就应该始终对其进行检查,在这种情况下,malloc
,fgets
,strdup
和{{1} }和。阅读文档以了解实际返回的内容,以了解如何检查错误。 sscanf
返回成功分配的数量,其他三个返回失败时为NULL的指针。
您在评论中写道,您正在从“让我们C”一书中学习。比较合适的标题是“如何不编写C代码”。我快速浏览了一下,真的很糟糕。除了教授非常过时的C语言外,它还教授一般的不良习惯。实际上,关于C的大多数问题都可以追溯到那本书,或者至少可以追溯到那本书。两个主要的例子是它始终避免使用非常重要的东西,例如sscanf
和scanf
之类的错误检查功能。我没有阅读每一行,但我认为甚至没有提到如何对malloc
进行错误检查。它还使用了scanf
函数,因为它非常危险,不仅不推荐使用,而且从新的C标准中完全删除。