在字符串数组中按相反顺序打印字符串。

问题描述 投票:-1回答:1

所以我做了这个程序,目的是从stdin中存储一个字符串,然后存储在一个字符串数组中。然后,我想打印所有存储在数组中的字符串,但顺序相反。

例子:

输入:

abc def hij klm nop

输出:

nop
klm
hij
def
abc

程序:

#include <stdio.h> 
#include <stdlib.h>
#include <string.h>
#define MAXLEN 1001

int main(){
    char buffer[MAXLEN];
    char** strings;
    int i = 0;
    int j = MAXLEN;
    strings = (char**)malloc(sizeof(char*)*MAXLEN);
    while(scanf("%s",buffer) == 3)
    {
        strings[i]=(char*)malloc(sizeof(char)*(strlen(buffer)+1));
        strcpy(strings[i],buffer);
        i++;
    }
    printf("%s",strings[0]);
}

好吧,我只是把第1个字符串,只是为了检查它是否打印任何字符串 问题是,如果在例子中键入,它打印的是: (null) 而不是单词,我想知道的是为什么它指向NULL而不是指向我给的字符串。

真的任何帮助将被感激。

c arrays string pointers multidimensional-array
1个回答
1
投票

成功转换的测试从 stdin 是不正确的。scanf() 返回的是转换次数,而不是字符数。你应该将返回值与 1. 按照编码,循环测试立即失败,所以 strings[0] 没有被修改,代码就会出现未定义的行为,因为由 malloc 是未初始化的。这个数组的开头恰好包含一个空指针(因为它的第一个字节恰好是零),而 printf 印花 (null) 的空指针,虽然C标准不保证这一点,但有时也是一个有用的指示。

此外,你应该告诉 scanf() 关于要存储到目标数组中的字的最大长度。scanf("%1000s", buf).

你还应该限制你撕入指针数组的字数,并测试内存分配错误。

最后,你需要一个循环来按照输入的相反顺序输出字符串。

下面是一个修改后的版本。

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

#define MAXLEN 1001

int main() {
    char buffer[MAXLEN];
    int i, j;
    char **strings = malloc(sizeof(char *) * MAXLEN);
    if (strings == NULL)
        return 1;
    for (i = 0; i < MAXLEN && scanf("%1000s", buffer) == 1; i++) {
        strings[i] = strdup(buffer);
        if (strings[i] == NULL)
            return 1;
    }
    for (j = i; j-- > 0;) {
        printf("%s\n", strings[j]);
        free(strings[j]);
    }
    free(strings);
    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.