如果没有垃圾字符,则无法打印字符串数组

时间:2010-10-11 01:49:16

标签: c

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]关闭终端   ...

我还需要能够读入包含空格的输入。谢谢!

3 个答案:

答案 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;
}