如何迭代数组中字符串的字符?

时间:2017-12-14 19:00:28

标签: c string loops

我想打印属于字符串数组的字符串的每个字符。

代码的第一部分是:将整数作为输入,并创建该大小的数组。然后添加n个单词来填充数组(所以我得到一个字符串数组)。

这是我的想法

int n;
scanf("%d", &n);
char *a[n];
a[n] = malloc(n*sizeof(char));

int i;
int j;

for (i = 0; i < n; i++) {

    a[i] = malloc(sizeof(char));

    }


for ( i = 0; i < n; i++) {

    printf("write the words: ");
    scanf("%s", a[i]);

    }

//till this point everything works  

//now I need to print each character of the strings

for ( i = 0; i < n; i++) {

    for ( j = 0; j < strlen(a[i][j]); j++) {

        printf("%s", a[i][j]);

        }

    }

我收到了这个警告:

  

format指定类型'char *'但参数的类型为'char'[-Wformat]

在这一行:

printf("%s", a[i][j])`;

如果我执行,在输入单词后,我会出现分段错误。我没有解决两个for循环的问题。

1 个答案:

答案 0 :(得分:2)

让我们逐行开始。

第1行错误,应为size_t n(表示long unsigned int)而不是int n,请详细了解MALLOC

下一行有问题:

a[n] = malloc(n*sizeof(char));

这意味着,如果n == 2,则您拥有:

a[2] = malloc(n*sizeof(char));

你访问该ARRAY越界,该行应该是:

a = malloc(n*sizeof(char));

但是这是另一回事,sizeof(char)至少1的标准保证所以这一行:

a = malloc(n*sizeof(char));

与此行相同:

a = malloc( n * 1 );

下一个问题

int i;
int j;

应该是:

size_t i;
size_t j;

为什么呢?好吧,因为一旦你意识到malloc期望size_t,那么你应该知道在那个LOOP中signedunsigend之间的比较不是你需要的。

下一个问题

for ( i = 0; i < n; i++) {
    for ( j = 0; j < strlen(a[i][j]); j++) {
        printf("%s", a[i][j]);

    }
}

这里有更多问题: strlen(a[i][j])应为strlen( a[i]

此行

printf("%s\n", a[i][j]);

printf("%c\n", a[i][j]);

你应该注意的事情

  • 始终检查scanf是否有错误。
  • 这些琴弦的长度非常重要。
  • 不要忘记freemalloc

将所有内容放在一起后,您将获得

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main ( void ){
    size_t n;

    if ( scanf("%zu", &n) != 1 ){
        printf("Error,scanf\n");
    }

    char *a[n];

    for ( size_t i = 0; i < n; i++ ) {
        a[i] = malloc( 256 );
        if ( a[i] == NULL ){
            printf("Error, malloc\n");
            for ( size_t k = 0 ; k < i ; k++ ){
                free( a[k] );
            }
            return 1;
        }
    }


    for ( size_t i = 0 ; i < n ; i++ ) {
        printf("write the words: ");
        if ( scanf("%255s", a[i]) != 1 ){
            printf("Error, scanf\n");
            for ( size_t k = 0 ; k < n ; k++ ){
                free( a[k] );
            }
            return 1;
        }
    }

    for ( size_t i = 0 ; i < n ; i++ ) {
        for ( size_t j = 0 ; j < strlen( a[i] ) ; j++ ) {
            printf("%c\n", a[i][j]);
        }
    }

    for ( size_t k = 0 ; k < n ; k++ ){
        free( a[k] );
    }
}