-1

我正在尝试制作一个从用户那里获取字符串并将其存储在数组中的程序。该程序不应允许存储超过五个名称,并且每个名称不得超过十个字符。我可以编译这个程序,但是当我运行它并选择选项“1”时,出现错误“分段错误(核心转储)”。该程序还应在选项“2”下显示名称列表。(我想我必须将大部分代码放在一个 do-while 循环中,只要 iSelect != 3 就可以运行。)

我在这里做错了什么?

代码是:

#include <stdio.h>

main() {
    char cList[20][5];
    char string[10];
    int iNum = 0;
    int iSelect = 0;
    int i = 0;
    int j = 0;
    int k = 0;

    printf("\n\n*** Friend List ***\n\nWhat will you do?\n\n1. Write a friends name in the list.\n2. Print out the names in the list.\n3. Quit\n---> ");
    scanf("%d ", iSelect);

    switch(iSelect) {
    case 1:
        // printf("\n\nWrite name nr %d (max 10 characters): \n", iNum);
        scanf(" %s", &string);
        for(i = 0 ; i < 10 ; i++) {
            cList[i][iNum] = string[i];
        }
        iNum++;
        break;

    case 2:
        for(j = 0 ; j <= iNum ; j++) {
            for(k = 0 ; k < 10 ; k++) {
                printf("%c", cList[k][j]);
            }
        }
        break;
    }

} //End of main()-function
4

4 回答 4

4
scanf("%d ", iSelect);

应该

scanf("%d ", &iSelect);

在这种情况下,scanf 需要一个指向 int 的指针,而不是一个 int!

于 2013-09-17T14:59:03.863 回答
2

您的编译器可能试图在这里为您提供帮助:

(nick@gorgeous)-(~/Desktop)
(502)-> gcc test.c 
test.c: In function ‘main’:
test.c:16: warning: format ‘%d’ expects type ‘int *’, but argument 2 has type ‘int’
test.c:16: warning: format ‘%d’ expects type ‘int *’, but argument 2 has type ‘int’
test.c:23: warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘char (*)[10]’
test.c:23: warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘char (*)[10]’

不要忽略警告,它会告诉你 2 行有问题,以及发现它们有什么问题。

于 2013-09-17T15:02:58.663 回答
1

尝试以下操作:

#include <stdio.h>

main() {
char cList[10][5]; //You said client names 10 char maximum so [10][5] instead of [20][5]
char string[10];
int iNum = 0;
int iSelect = 0;
int i = 0;
int j = 0;
int k = 0;


do{
printf("\n\n*** Friend List ***\n\nWhat will you do?\n\n1. Write a friends name in the list.\n2. Print out the names in the list.\n3. Quit\n---> ");
scanf("%d ", &iSelect); //&iSelect instead of iSelect

switch(iSelect) {
case 1:
    if (iNum != 5){ //When iNum is 5 it's because cList is full. You can't add another name
    scanf("%s", &string);
    for(i = 0 ; i < 10 ; i++) {
        cList[i][iNum] = string[i];
    }
    iNum++;
    }
    else{
    printf("Your list is full"); //cList can contain maximum 5 names.
    }
    break;

case 2:
    for(j = 0 ; j <= iNum ; j++) {
        for(k = 0 ; k < 10 ; k++) {
            printf("%c", cList[k][j]);
        }
    }
    break;
}
}while(iSelect != 3); //keeps your app running until user presses option 3
}

我对您的代码提供了一些帮助,但我认为您应该做的是使用动态内存。你说名字不能超过 10 个字符,但是如果每个名字都是 5 个字符长呢?

希望能帮助到你

于 2013-09-17T16:05:20.647 回答
0

由于您的问题已经有了很好的答案,我将为这个项目或其他项目添加两个小建议:

您可以使用strcpy函数将一个 char[] 复制到另一个 char[]。

您还可以在运行时为您的 char[] 分配内存malloc

  char * string = "A sample String";
  char* copy;

  copy = (char*) malloc(sizeof(char) * strlen(string));
  strcpy(copy,string);

  printf("%s", copy);

在您的情况下,您可以使用scanfasstring

于 2013-09-17T15:03:11.257 回答