Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 没有字符串数组的输出_C_String_Pointers - Fatal编程技术网

C 没有字符串数组的输出

C 没有字符串数组的输出,c,string,pointers,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]); char*s[6]; int n=6,i=0; char-str[10]; 而(n--) { scanf(“%s”,str); s[i]=str; i++; }

我想创建一个字符串数组 下面是节目

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]);
char*s[6];
int n=6,i=0;
char-str[10];
而(n--)
{
scanf(“%s”,str);
s[i]=str;
i++;
}
对于(i=0;i
您正在为所有
s
分配相同的
str
。所有字符串在打印时都是相同的。如果由于某种原因最后一个字符串为空,则所有字符串都将为空

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

修复
while(n--)
{
scanf(“%s”,str);
如果(i>=6)中断;/*1.不能超过6*/
s[i]=malloc(strlen(str)+1);/*2.分配*/
if(s[i])strcpy(s[i],str);/*3.复制*/
i++;
}
n=5;/*4.重置*/

对于(i=0;i而言,
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] );
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];
#包括
//...
#定义n6
//...
字符s[N][10];
int n=n,i=0;
char-str[10];
而(n--)
{
scanf(“%9s”,str);
strcpy(s[i],str);
i++;
}
对于(i=0;i
while循环最好作为for循环编写

for ( i = 0; i < n; i++ )
{
    scanf("%9s", str );
    strcpy( s[i], str );
}
(i=0;i { scanf(“%9s”,str); strcpy(s[i],str); }
还要注意的是,如果编译器支持可变长度数组,并且数组s是函数的局部变量(例如main),那么可以用以下方法定义它

#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] );
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];
intn;
printf(“输入要输入的字符串数:”);
scanf(“%d”和“&n”);

如果(n
n
在for循环的开始处为0。您的所有字符串也将指向最后一个扫描的字符串。
char*s[5];
可以容纳五个字符串(
char*
)。谢谢!是否可以不进行动态分配?@Ravi yes使用
char[6][最大字符串长度]
,但您仍然需要
strcpy
或直接阅读
s[i]
@MohitJain您不知道strdup()吗?@Heathunnicutt Yes
strdup
适用于unix类型的系统(请确保最后释放)。但您必须同时注意,它不是ISO C标准本身的一部分,是POSIX扩展。@MohitJain当然最后必须释放它,就像malloc()一样。我不是问它是否有效,而是指出它更好。