C中的二维数组字符

时间:2013-07-04 09:21:49

标签: c c-strings

帮助我摆脱这个问题。我在ubuntu12.04上使用GCC。当我编写这个程序从键盘n获取5个字符串然后在屏幕上打印这些字符串。程序已编译但在执行期间它从键盘获取字符串但仅打印最后一个字符串。我写的程序如下:

void main()    
{  
    char names[10];  
    int i,j;

    for(i=0;i<5;i++)  
    {  
        printf(" Enter a name which you want to register\n");  
        scanf("%s",names);  
    }  
    for(i=0;i<5;i++)    
        printf(" the names you enter are %s\n", names);  

}

5 个答案:

答案 0 :(得分:12)

1)你可以用这种方式使用2D char数组

char name[5][100];

2D数组中的每一行都是char数组,其大小为100

for(i=0;i<5;i++)  
{
    printf(" Enter a name which you want to register\n");  
    scanf("%99s",names[i]);
}

2)你可以用这种方式使用指针数组

char *name[5];

数组中的每个元素都是一个指向字符串(char数组)的指针。在调用scanf()

之前,必须将数组中的每个指针分配给一个内存空间
for(i=0;i<5;i++)  
{
    names[i]=malloc(100);  
    printf(" Enter a name which you want to register\n");  
    scanf("%99s",names[i]);
}

3)如果您使用gcc和gcc版本&gt; 2.7进行编译,那么您的scanf()可以使用"%ms"代替"%s"来分配内存

char *name[5];
for(i=0;i<5;i++)  
{
    printf(" Enter a name which you want to register\n");  
    scanf("%ms",&names[i]);
}

答案 1 :(得分:0)

有一个关于在char数组中读取和保存字符串的简单示例。

library("shiny")
library("DT")

ldata <- data.frame(
  name = c('b','e','d','b','b','d','e'),
  age  = c(20,20,21,21,20,22,22)
)

#

server <- shinyServer(function(input,output, session){

  output$ldata_table <- renderDataTable({
    datatable(ldata, filter = "top")
  })

  subsetted_data <- reactive({
    # the input$<shiny-id>_rows_all populated by the DT package,
    # gets the indices of all the filtered rows
    req(length(input$ldata_table_rows_all) > 0)

    ldata[as.numeric(input$ldata_table_rows_all),]
  })

  output$state <- renderPrint({
    summary(subsetted_data())
  })
})

ui <- fluidPage(
  dataTableOutput("ldata_table"),
  verbatimTextOutput("state")
)

shinyApp(ui, server)

答案 2 :(得分:0)

这是我用指针编写的代码。

#include <stdio.h>
void main()
{
   char *string[100];
   int ln;

   printf("Enter numbar of lines: ");
   scanf("%d",&ln);
   printf("\n");
   for(int x=0;x<ln;x++)
   {    
     printf("Enter line no - %d ",(x+1));
     scanf("%ms",&string[x]);  // I am using gcc to compile file, that's why using %ms to allocate memory.              
   }
   printf("\n\n");
   for(int x=0;x<ln;x++)
   {            
     printf("Line No %d - %s \n",(x+1),string[x]);  
   }

}   

使用二维数组的另一个代码

    #include <stdio.h>

    void main()
    {

    int ln;

    printf("Enter numbar of lines: ");
    scanf("%d",&ln);
    printf("\n");

    char string[ln][10];

    for(int x=0;x<ln;x++){
        printf("Enter line no - %d ",(x+1));
        scanf("%s",&string[x][0]);
    }


    for(int x=0;x<ln;x++)
    {           
        printf("Line No %d - %s \n",(x+1),string[x]);   
    }



}   

答案 3 :(得分:0)

在您的程序中,错误是您没有将运算符的'&'地址放入第一个for循环中。如果您将%s字符串存储在名称中,而不是以&names [0]或&names [1]等存储,则您的情况下的names是一个数组,那么由于数组本身充当了指针,因此数组“ names”指向其地址第一个元素,即names [0]。因此,如果您正在编写scanf(“%s”,names);类似于scanf(“%s”,&names [0]);因此,由于您仅将名称存储在一个元素中,因此对于最后输入的最后一个字符串,也将存储5次迭代,而先前的字符串将消失。因此只有最后一个字符串会打印在您的程序中。

答案 4 :(得分:0)

在您的代码中,您仅声明char数据类型为一维,因此它将始终覆盖先前的输入,这就是为什么结果是最后一次打印5次的结果。

char names[10];

以上声明意味着您仅声明10个字符大小的char类型变量而没有额外的数组,这意味着您仅声明5个输入的单个变量。

要创建二维字符,您将需要像这样声明它:

char names[5][10];

在上面的代码中,这意味着您在一个5数组中声明了一个10个字符大小的char类型变量。