c - 从键盘接受 5 个字符串的程序

标签 c arrays string pointers

/* 使用指针接受和打印 5 个字符串的程序 */

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define SIZE 100

int main()
{
    char **s;
    int i;
    s = (char *)malloc(sizeof(char)*5);
    for(i=0;i<5;i++)
    {
        *(s+i) = (char *)malloc(sizeof(char)*SIZE);
    }

    printf("enter 5 strigs\n");
    for(i = 0;i<5;i++)
    {
       fgets((s+i),SIZE,stdin);
    }
    //printing the strings
    for(i = 0;i<5;i++)
    {
            puts((s+i));
    }
     return 0;
  }

这个程序接受来自键盘的 5 个字符串并在屏幕上打印。它工作正常但显示许多警告。是否有任何其他方法来执行相同的操作(仅使用指针)。请给我建议。

最佳答案

您代码中最大的问题是您没有为s 分配足够的内存:

s = malloc(sizeof(char*)*5);
//                    ^
// Add an asterisk here

否则就是未定义的行为。

第二大问题是您没有释放分配的任何内存。这是内存泄漏。要正确执行此操作,您需要一个循环,该循环在 s 的每个元素上调用 free,然后在 s 本身上调用:

for(i = 0;i<5;i++) {
    free(s[i]);
}
free(s);

最后,您不应该强制转换 malloc 的结果。

作为样式的一点,考虑为 s 中的元素数定义一个常量,就像您定义 SIZE 而不是使用 100 直接。切换到数组样式的取消引用也可能有意义,而不是手动进行指针运算,即 puts(s[i]); 而不是 puts((s+i));

关于c - 从键盘接受 5 个字符串的程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23444365/

相关文章:

c++ - 如何调用用c++编写的程序调用我用c编写的DLL

c - C语言将文件读入链表

c - 用C语言读写32位wav文件

javascript - 如何正确使用 indexOf() 处理多个元素?

c++ - 为什么 C++ 与动态数组的乘法比 std::vector 版本更好

.net - 如何在vb net中设置多行字符串变量

c - 为什么我的 c 程序在打印数组时停止工作

c - 在 C 中使用 va_list 作为数组

安卓字符串颜色

java - 方法 String encode(String str) 使用 switch 语句根据以下规则对字符串 str 的内容进行编码