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

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

#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(使用两个s补数算术的32位程序)计算

变量的const视图是否定义良好?

Ebpf内核代码:permission denied:invalid access to map value

如何将不同长度的位转换成字节数组?

如何使用Python C API实现多线程程序?

在struct中调用函数,但struct在void中 *

如何在Visual Studio代码中关闭此函数名称显示功能?

正在try 将文件/文件夹名从目录 struct 存储到链接列表

如果包含路径不存在,我的编译器可以被配置为出错吗?(GCC、MSVC)

从纯C中访问通用项对话框

Clang警告称,`ffi_type`与`sizeof`不兼容

Square不与Raylib一起移动

如何在POSIX-UEFI中获得输入?

预处理器宏扩展(ISO/IEC 9899:1999(E)§;6.10.3.5示例3)

将数组插入数组

C代码可以在在线编译器上运行,但不能在Leetcode上运行

如何在C宏定义中包含双引号?

在同一范围内对具有相同类型的变量执行的相同操作在同一C代码中花费的时间不同

我的代码可以与一个编译器一起使用,但不能与其他编译器一起使用

当 a 是代码块时使用逗号运算符 (a, b)