0

帮助我摆脱这个问题。我在 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);  

}
4

5 回答 5

18

1)您可以通过这种方式使用二维字符数组

char names[5][100];

二维数组中的每一行都是一个大小为 100 的 char 数组

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

2)您可以通过这种方式使用指针数组

char *names[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 版本 >2.7 进行编译,那么您scanf()可以使用"%ms"而不是分配内存"%s"

char *names[5];
for(i=0;i<5;i++)  
{
    printf(" Enter a name which you want to register\n");  
    scanf("%ms",&names[i]);
}
于 2013-07-04T09:25:34.830 回答
0

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

#include <stdio.h>

const int MACRO = 6;

int main() {
  printf("Hello Admin Please Enter the  Items:\n");

  char items[MACRO][20];

  for (int i = 0; i < MACRO; ++i) {
    scanf("%19s", items[i]);

  }

  for (int i = 0; i < MACRO; ++i) {
    printf("%s ", items[i]);
  }

  return 0;
}
于 2018-05-01T15:21:21.050 回答
0

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

于 2020-07-17T12:10:23.133 回答
0

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

char names[10];

上面的声明意味着你只声明一个 10 个字符大小的 char 类型变量而没有额外的数组,这意味着你只为 5 个输入声明一个变量。

要制作二维字符,您需要像这样声明它:

char names[5][10];

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

于 2020-11-02T08:28:19.883 回答
-1

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

#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]);   
    }



}   
于 2018-06-03T15:09:29.863 回答