int main(int argc, char** argv) {
char *test[5][20];
char *input[20];
int i;
for(i=0;i<5;i++){
printf("enter> ");
fflush ( stdout );
fgets(input,20,stdin);
*test[i] = *input;
}
for(i=0;i<5;i++)
printf("%d | %s\n",i,test[i]);
return 0;
}
输出:
输入&GT; PWD
输入&GT; pathd
输入&GT; LS
输入&GT; echo $ path
输入&GT; pwd 0 | PWD
1 | path▒]a▒▒a▒▒#a▒▒2| LS
3 | echo▒▒(4 | pwd
按[Enter]关闭终端 ...
我还需要能够读入包含空格的输入。谢谢!
答案 0 :(得分:2)
使用memcpy()
。而且你需要删除尾随的换行符。这里:
#include <stdio.h>
#include <string.h>
void chopnl(char *s) { //strip '\n'
s[strcspn(s, "\n")] = '\0';
}
int main() {
char test[5][20];
char input[20];
int i;
for(i=0;i<5;i++){
printf("enter> ");
fflush ( stdout );
fgets(input, 20, stdin);
chopnl(input);
memcpy(test[i], input, strlen(input)+1);//test[i] = input;
}
for(i=0;i<5;i++)
printf("%d | %s\n",i,test[i]);
return 0;
}
答案 1 :(得分:1)
你的类型都搞砸了。 C中的字符串本质上是指向字符的指针,该字符开始以空字节结尾的字符序列。
Input是一个指向字符的指针数组 - 或者就此而言,是一个字符串数组。你正在做的是在输入中读取20个字符,其中fgets表达式中的输入充当数组的第一个元素的地址。所以你从stdin读取20个字符到输入的20个字符指针。这不是你想要的。您想要将字符读入字符串的空间。
我假设您正在使用GCC进行编译 - 考虑使用-Wall,因此GCC会警告您类型问题。
另一个问题是
*test[i] = *input;
由于这似乎是家庭作业,我觉得我已经提供了足够的细节。
答案 2 :(得分:0)
我知道这个问题已经回答并且已经很老了,但是接受的解决方案实际上是错误的。如果输入超过19个字符stdin
将留下将在下一个fgets()上读取的字节,它将找到换行符,下一个条目将不正确。
请参阅以下代码并注意一些事项:
- 您不需要单独的缓冲区来读取您的输入。只需直接读入数组即可。
- 读入数组后,删除'\n'
- 如果需要,请刷新stdin
#include <stdio.h>
#include <string.h>
int main()
{
char test[5][20+1] = {{0}}; // extra space for NULL
int i;
int c;
char *ptr = NULL;
for(i=0;i<5;i++){
printf("enter> ");
fgets(test[i], 20+1, stdin); // fgets read n-1 characters so we add 1 since our buffer has space for null already
if( (ptr = strrchr(test[i], '\n') ) )
{
*ptr = 0x00;
}
else
{
// need to flush stdin since '\n' wasn't found fgets() didn't read all of input
while( (c = getchar()) != '\n' && c != EOF );
}
}
for(i=0;i<5;i++)
printf("%d | %s\n",i,test[i]);
return 0;
}