没有字符串数组的输出

时间:2015-07-05 12:29:13

标签: c string pointers

我想创建一个字符串数组 以下是程序

char *s[6];
int n=6,i=0;
char str[10];
while(n--)
{
    scanf("%s",str);
        s[i]=str;
        i++;
}
for(i=0;i<6;i++)
    printf("%s\n",s[i]);

键盘接受六个字符串,但输出中没有显示任何内容。 有人可以帮我从这里出去吗? 谢谢!

2 个答案:

答案 0 :(得分:4)

s[i]=str;

您要为所有str分配相同的s。打印时所有字符串都相同。如果由于某种原因,最后一个字符串为空,则所有字符串都为空。

此外,您应该在第二次循环之前将n重置为5

修复

while(n--)
{
    scanf("%s",str);
    if(i >= 6) break;  /* 1. Can not go beyond 6 */
    s[i]=malloc(strlen(str) + 1);  /* 2. Allocate */
    if(s[i]) strcpy(s[i], str); /* 3. Copy */
    i++;

}
n = 5; /* 4. reset */
for(i=0;i<n;i++)
    printf("%s\n",s[i]);
...

for(i = 0; i < n; i++) free(s[i]); /* 5. free */

答案 1 :(得分:3)

str的地址已修复。因此在声明中

s[i]=str;

字符指针数组的每个元素都获得相同的地址。 您至少可以通过以下方式更改代码段

#include <string.h>
//...
#define N 6

//...

char s[N][10];
int n = N, i = 0;
char str[10];

while ( n-- )
{
    scanf("%9s", str );
    strcpy( s[i], str );
    i++;
}
for( i = 0; i < N; i++ )
    puts( s[i] );

while循环最好写为for循环

for ( i = 0; i < n; i++ )
{
    scanf("%9s", str );
    strcpy( s[i], str );
}

另外要注意,如果您的编译器支持可变长度数组,并且数组是函数的局部变量(例如main),您可以通过以下方式定义它

int n;

printf( "Enter the number of strings you are going to enter: " );
scanf( "%d", &n );

if ( n <= 0 ) n = N;
char s[n][10];