在C++中用指针数组接受用户的字符串

62o28rlo  于 2023-02-07  发布在  其他
关注(0)|答案(2)|浏览(109)

该代码试图获得3名学生的名字和他们的成绩在3个科目和打印总分以及平均分的每个学生沿着他们的名字。

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

int main() {

    char *names[3];
    int test1[3],test2[3],test3[3];
    for(int i=0;i<3;i++)
    {
        scanf("%s",&(*(names+i)));
        scanf("%d",&test1[i]);
        scanf("%d",&test2[i]);
        scanf("%d",&test3[i]);
    }
    int j=0;
    while(j<3){
        
        printf("%s",*(names+j));
        printf(" %d ",test1[j]+test2[j]+test3[j]);
        printf("%.f\n",(test1[j]+test2[j]+test3[j])/3.0);
        j++;   
    }
    return 0;
}

但是当我运行这段代码时,我没有得到while循环中的printf的输出,有人能帮帮我吗?

ux6nzvsh

ux6nzvsh1#

变量names是一个指针数组,但是你从来没有让这些指针指向任何地方,任何试图去引用它们的行为都会导致 undefined behavior

另外&names[i]的类型(&(*(names+i))的实际类型)是char **,这 * 不是 * scanf``%s所期望的。格式说明符和参数类型不匹配 * 也 * 导致未定义的行为。

您应该使用的是一个由 *arrays * 字符组成的数组:

char names[3][256];

并使子数组衰减到指向其第一元素的指针(表达式names[i]衰减到具有类型char *&names[i][0]):

scanf("%255s", names[i]);

注意,我添加了一个长度说明符,以避免超出names[i]的范围。
然后打印为普通字符串:

printf("%s %d %f\n", names[j],
       test1[j] + test2[j] + test3[j],
       (test1[j] + test2[j] + test3[j]) / 3.0);
eufgjt7s

eufgjt7s2#

对于初学者来说,你包含了太多的标题。

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

实际上,程序中只使用了头文件<stdio.h>的声明,所以去掉所有其他头文件,只留下头文件<stdio.h>

#include <stdio.h>

在本声明中

char *names[3];

声明了具有不确定值指针的未初始化数组。
所以这个scanf的调用

scanf("%s",&(*(names+i)));

至少应该写成

scanf("%s",*(names+i));

因为表达式&(*(names+i))具有类型char **,但是函数期望类型char *的参数,所以调用未定义的行为。
要存储字符串,您需要声明字符数组的数组,例如

char names[3][100];

但无论如何,声明四个数组的方法看起来并不好。
最好将结构声明为

enum { NumberOfStudents = 3, NumberOfMarks = 3, MaxNameLen = 100 };

struct Student
{
    char name[MaxNameLen];
    unsigned int marks[NumberOfMarks];
};

在这种情况下,您只能声明一个包含三个struct Student类型对象的数组。
这是一个演示程序

#include <stdio.h>

int main( void )
{
    enum { NumberOfStudents = 3, NumberOfMarks = 3, MaxNameLen = 100 };

    struct Student
    {
        char name[MaxNameLen];
        unsigned int marks[NumberOfMarks];
    };

    struct Student students[NumberOfStudents];

    printf( "Enter information about %d srudents.\n", NumberOfStudents );

    for (int i = 0; i < NumberOfStudents; i++)
    {
        printf( "Name of student #%d: ", i + 1 );

        scanf( "%99s", students[i].name );

        printf( "Enter his %d marks: ", NumberOfMarks );

        for (int j = 0; j < NumberOfMarks; j++)
        {
            scanf( "%u", &students[i].marks[j] );
        }
    }

    puts( "\nHere are the students with their total and average marks." );

    for (int i = 0; i < NumberOfStudents; i++)
    {
        printf( "%s: ", students[i].name );

        unsigned total = 0;

        for (int j = 0; j < NumberOfMarks; j++)
        {
            total += students[i].marks[j];
        }

        printf( "%u %.1f\n", total, ( double )total / NumberOfMarks );
    }

}

程序输出可能如下所示

Enter information about 3 srudents.
Name of student #1: Tom
Enter his 3 marks: 4 5 3
Name of student #2: Mary
Enter his 3 marks: 5 5 4
Name of student #3: Bob
Enter his 3 marks: 6 6 4

Here are the students with their total and average marks.
Tom: 12 4.0
Mary: 14 4.7
Bob: 16 5.3

相关问题