我想从用户那里获取一些字符串,然后将它们放入一个数组中,然后找到最长的字符串并反向打印它.

对于第一部分,我想知道下面示例中的数组是否正确,所以我决定打印它的元素,但结果不正确.

#include <stdio.h>

int main() {
    int n;
    puts("How many strings do you want to enter ? ");
    scanf("%d", &n);
    char strings_array[n];//the array that I want to save strings in
    for (int i = 0; i < n; i++)//getting strings from user
    {
        printf("Please enter string number %d : ", i+1);
        scanf("%s", &strings_array[i]);
    }
    //print the elements of array to test if it works or not
    for (int j = 0; j < n; j++)
    {
        printf("%s\n", &strings_array[j]);
    }
    return 0;
}

推荐答案

C中的string是一个连续的非零字节序列,后面跟着零字节(以空值结尾的字节'\0').

char是表示单个字符的类型-恰好是byte.

char strings_array[n];是一个包含n个字节的variable-length array,实际上只适合容纳一个string,字符串长度最多为n - 1个字符(必须始终为空终止字节留出空间).

(Note: if the user is clever enough to enter a value less than one, this program invokes 100 by declaring an array whose size is less than one. Additionally, the user may enter a very large value, potentially exhausting your programs 101. It is a good idea to validate user input.)

因此,要拥有多个字符串数组,您必须真正创建一个数组数组(或指针数组,但现在让我们重点介绍前者).

char strings[n][16];将是由n个数组组成的数组,每个数组16个字节.它将能够容纳n个字符串(每个字符串的最大长度为15).

这有时被称为two-dimensional数组,这使得它很容易可视化.假设是n=4,那么这个数组可以如下所示,其中每cell是一个字节:

[  ][  ][  ][  ][  ][  ][  ][  ][  ][  ][  ][  ][  ][  ][  ][  ]
[  ][  ][  ][  ][  ][  ][  ][  ][  ][  ][  ][  ][  ][  ][  ][  ]
[  ][  ][  ][  ][  ][  ][  ][  ][  ][  ][  ][  ][  ][  ][  ][  ]
[  ][  ][  ][  ][  ][  ][  ][  ][  ][  ][  ][  ][  ][  ][  ][  ]

如果您要求用户填充前两个sub-arrays(如scanf("%15s", &strings[i])),并输入hello,然后输入stackoverflow,则数组将如下所示:

[ h][ e][ l][ l][ o][\0][  ][  ][  ][  ][  ][  ][  ][  ][  ][  ]
[ s][ t][ a][ c][ k][ o][ v][ e][ r][ f][ l][ o][ w][\0][  ][  ]
[  ][  ][  ][  ][  ][  ][  ][  ][  ][  ][  ][  ][  ][  ][  ][  ]
[  ][  ][  ][  ][  ][  ][  ][  ][  ][  ][  ][  ][  ][  ][  ][  ]

以下是一个实用示例:

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

static void fatal(const char *msg)
{
    fprintf(stderr, "%s\n", msg);
    exit(EXIT_FAILURE);
}

int main(void)
{
    int n;

    printf("How many strings do you want to enter? ");
    if (1 != scanf("%d", &n) || 1 > n || n > 32)
        fatal("Invalid size specified.");

    char strings[n][64];

    for (int i = 0; i < n; i++) {
        printf("Please enter string #%d: ", i + 1);
        if (1 != scanf("%63s", strings[i]))
            fatal("Invalid string input.");
    }

    for (int i = 0; i < n; i++)
        puts(strings[i]);
}

请注意,我们总是判断返回值scanf是成功conversions的预期数量(%done转换说明符,因此如果返回值不是1,则发生错误).

另外请注意,我们通过将maximum field-width指定为%63s来限制scanf可以使用%s读取的数据量,这是我们的数组可以容纳的最长字符串(数组的大小减go 1,为空终止字节留出空间).在不指定此限制的情况下,scanf可以读取的数据多于数组可以存储的数据,从而导致buffer overflow.

程序I/O:

How many strings do you want to enter? 2
Please enter string #1: hello
Please enter string #2: stackoverflow
hello
stackoverflow

C++相关问答推荐

C/C++中的状态库

在C中使用强制转换将uint16_t转换为uint8_t [2]是否有效?

C/SDL程序,渲染不使用我的渲染器

C:fopen是如何实现二进制模式和文本模式的?

是否所有C编译器在将浮点数转换为整型数时都会隐式删除小数?

C由四个8位整数组成无符号32位整数

我在这里正确地解释了C操作顺序吗?

如何将字符**传递给需要常量字符指针的常量数组的函数

Sizeof(&Q;字符串&Q;)的正确输出是什么?

在基本OpenGL纹理四边形中的一个三角形中进行渲染

将变量或参数打包到 struct /联合中是否会带来意想不到的性能损失?

如何确保我将使用C标准库函数的函数版本,如&getc";,而不是类似函数的宏版本?

C编译和运行

从Raku nativecall调用时精度不同

当读取可能会阻塞管道中的父进程时,为什么要等待子进程?

C 和 C++ 标准如何告诉您如何处理它们未涵盖的情况?

当另一个指向 const 的指针观察到数据时,通过指针更改数据是否安全?

如何为avr atmega32微控制器构建C代码,通过光电二极管捕获光强度并通过串行通信传输数据

多行表达式:C 编译器如何处理换行符?

C11 嵌套泛型