在C中打印最后一个字符串名称

时间:2014-04-13 19:41:37

标签: c string

我正在尝试学习C,在这里我得到了一个程序,我们必须将用户的输入作为n个字符串字符串,比较它并按字母顺序排列。按字母顺序排列后,我只需要打印订单中出现的姓氏。

以下是上述问题的代码:

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

int main()
{
     int i,j,m,n,len;
     char a[50][50],temp[100];
     char last ;

     printf("Enter the number of elements you wish to order : ");
     scanf("%d",&m);
     printf("\nEnter the names :\n");

     for (i=0;i<m;i++){
       scanf("%s",a[i]);
      }

      for (i=0;i<m;i++){
       for (j=i+1;j<m+1;j++) {
        if (strcmp(a[i],a[j])>0) {
           strcpy(temp,a[i]);
           strcpy(a[i],a[j]);
           strcpy(a[j],temp);
          }
         }
        }

    printf("\n\nSorted strings are : ");
     for (i=0;i<m+1;i++){
       printf("%s \n",a[i]);
      }
    return 0;
}


答案是这样的:

输入您要订购的元素数量:4

输入名称: 领土 状态 你好 像

分类字符串是:S $ ??? 你好 喜欢 状态 境

我的问题是,为什么我会得到&#34; S $ ???&#34;而且我只想要最后一个字&#34;领土应该打印出来并不是所有的名字&#34;。

任何人都可以让我知道我哪里错了吗?这将是一个很大的帮助。

由于 坦尼亚

3 个答案:

答案 0 :(得分:2)

您正在使用索引m+1[0..m]个字符串进行排序。但是您只输入m个字符串。

您的索引不应超过m-1

答案 1 :(得分:0)

\检查此代码

在您的代码中,您输入为4

然后
一个[0] =领土
一个[1] =状态
一个[2] =你好
[3] =像

但是你的代码最多运行3次上循环,然后i = 3

在下一个循环中,j = i + 1,然后j = 4

但是[4] =不存在

这就是为什么&#34; S $ ???&#34;发生

解决方案:

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

int main() {
  int i, j, m, n, len;
  char a[50][50], temp[100];
  char last;
  printf("Enter the number of elements you wish to order : ");
  scanf("%d", &m);

  printf("\nEnter the names :\n");
  for (i = 0; i < m; i++) {
    scanf("%s", a[i]);
  }

  for (i = 0; i < m - 1; i++) {   // m - 1  enough maximum i = 2;
    for (j = i + 1; j < m; j++) { // j maximum j = i + 1   j = 3
      if (strcmp(a[i], a[j]) > 0) {
        strcpy(temp, a[i]);
        strcpy(a[i], a[j]);
        strcpy(a[j], temp);
      }
    }
  }

  printf("\n\nSorted strings are : ");  // print all words in sorted order
  for (i = 0; i < m; i++) {
    printf("%s \n", a[i]);
  }
  printf("Last Word:\n");
  printf("%s\n", a[m - 1]); // a[3] contains last name 
  return 0;
}

答案 2 :(得分:0)

这是我在turbo c ++中为我工作的程序

    #include<conio.h>
    #include<iosream.h>
    #include<ctype.h>
    #include<string.h>
    #include<stdio.h>
    #include<stdlib.h>

    void main()
    {
    clrscr();
    char name[100];
    int c=0;

// to take the name including spaces
gets(name);

//this line is to print the first character of the name
cout<<name[0];

//this loop is to print the fist character which is there after every space
for(int l=0;name[l]!='\0';l++)
{
      if(name[l]==' ')
       { 
         cout<<"."<<name[l+1];
//l+1 is used because l is the space and l+1 is the character that we need
       }
}


//this loop is to find out the last space in the entire sting

for(int i=0;name[i]!='\0';i++)
{
     if(name[l+1]==NULL)
     {

      //here we fond the last space in the string
                for(int j=i;name[j]!=' ';j--)
                {
                c=j+1;
                }
// c=j+1 is used bacause we have already taken the first letter of the that word
//no need of taking it again
     }
}
//this loop starts from the last space and the position(of space) is stored in k
for(int k=c;name[k]!='\0';k++)
{
cout<<name[k];
}

    getch();
}

输出:

antt ranjan shukla
a.r.shukla