【问题标题】:No output of array of strings没有字符串数组的输出
【发布时间】:2015-07-05 12:29:13
【问题描述】:

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

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]);

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

【问题讨论】:

  • n 在 for 循环开始时为 0。您的所有字符串也将指向最后一个扫描的字符串..
  • char *s[5]; 可以容纳五个字符串(char *)。

标签: c string pointers


【解决方案1】:
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 */

【讨论】:

  • 谢谢!没有动态分配可以吗?
  • @Ravi 是的使用char s[6][MAX_STRING_LENGTH],但您仍然需要strcpy 或直接阅读s[i]
  • @MohitJain 你不知道 strdup() 吗?
  • @HeathHunnicutt 是的,strdup 适用于 unix 类型的系统(确保最后释放)。但您必须同时注意,它不是 ISO C 标准本身的一部分,而是 POSIX 扩展。
  • @MohitJain 当然必须在最后释放它,就像 malloc() 一样。我不是在问它是否会起作用,我是在指出它更好。
【解决方案2】:

str的地址是固定的。因此在声明中

s[i]=str;

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

#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 );
}

另外请注意,如果您的编译器支持可变长度数组并且数组 s 是函数的局部变量(例如 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];

【讨论】:

    猜你喜欢
    • 2017-02-09
    • 2012-11-15
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 2012-08-06
    相关资源
    最近更新 更多