【问题标题】:Storing user input into string array in C将用户输入存储到C中的字符串数组中
【发布时间】:2012-10-26 04:46:29
【问题描述】:

我正在编写一个程序,它应该从用户那里获取一个名称列表,将它们存储在一个数组中,然后在列表中搜索以检查用户输入的下一个名称是否是原始名单。

我遇到的问题是,当我输入姓名列表时,它只会保存输入到列表中的姓氏。这是我遇到问题的代码部分:

#include<stdio.h>
#include<conio.h>
#include<string.h>

#define MAX_NAMELENGTH 10
#define MAX_NAMES 5
void initialize(char names[MAX_NAMES][MAX_NAMELENGTH]);

int main()
{
    char names[MAX_NAMES][MAX_NAMELENGTH];

    initialize(names);
    getch();
    return 0;
}

void initialize(char names[MAX_NAMES][MAX_NAMELENGTH])
{
    int i,Number_entrys;

    printf("How many names would you like to enter to the list?");
    scanf("%d",&Number_entrys);

    if (Number_entrys>MAX_NAMES) {
       printf("Please choose a smaller entry");
    }   
    else {
        for (i=0; i<Number_entrys; i++){
            scanf("%s",names[i]);
        }   
    }   

    printf("%s",names); 
}

【问题讨论】:

    标签: c arrays string


    【解决方案1】:

    应该是scanf("%s",names[i]);

    现在,您将其存储为scanf("%s",names);,相当于scanf("%s",names[0]);

    因此,您在每次传递中都会覆盖相同的数组条目。

    编辑: 此外,当您将char names[][] 传递给函数时,它只会将指针传递给第一个元素。您应该声明它的至少一个边界,与您声明它的值相同。

    int main(){
        //To accept 2 names of 2 characters each
        char names[2][2];// or char** names;
        initialize(names, 2,2);
    }
    void initialize(char names[][2],const int MAX_NAMES,const int MAX_NAMELENGTH){ .. }
                                 ^ syntax error if index not present
    

    (Reference)

    【讨论】:

    • 看到我知道这可能是正确的答案,但每次我尝试实现时,我都会收到一个错误提示“无效使用未指定边界的数组”。我认为你所说的方式是合乎逻辑的,但我无法弄清楚那个错误,所以我开始怀疑自己。
    • 在传递char names[][]时还需要传递一维。在你的函数中尝试char names[][1]。请参阅编辑后的答案。
    • 这很有趣,不知道会影响它。修复了错误,但现在它输出输入的第一个名字的第一个字母,然后是输入的下一个名字的全名。哦,编程的乐趣哈哈。
    • 第一个字母是因为您使用了 1 的上限。将 1 替换为 MAX_NAMELENGTH 的值。 char names[][MAX_NAMELENGTH]
    • 查看编辑后的答案。我已经提到 2 是//To accept 2 names of 2 characters each。您必须将其更改为您想要接受的字符数。
    【解决方案2】:

    您应该将名称存储到数组中的特定条目中:

    scanf("%s", names[i]);
    printf("%s\n", names[i]);
    

    还有一些通用问题:

    • 像 MAX_NAMES 这样的大写名称在大多数情况下用于定义而非变量
    • scanf 不是一个安全函数,因为您无法限制它读取和写入的字符数

    【讨论】:

    • 有趣,我不知道。感谢您提供的信息,请记住这一点以备将来使用。
    【解决方案3】:

    要检查您目前的条目,您需要从0 循环到i-1(在读入names[i] 之后)并对照最近的条目检查每个条目。

    要比较字符串,您可以使用strcmp:

    if( strcmp(names[i], names[j]) == 0 ) {
        /* Duplicate name - reboot universe */
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-27
      • 1970-01-01
      • 1970-01-01
      • 2016-06-26
      • 1970-01-01
      • 2013-09-23
      相关资源
      最近更新 更多