Lỗi không in ra chuỗi theo thứ tự bằng câu lệnh command line argument

Hi mọi người, Em có bài tập mới về chuỗi. Khi user nhập bất cứ từ nào. Thì mình sẽ in từ đó ra theo thứ tự.

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

void printArray (char array[][500], int numberOfWords);
int main()
{

 
  int numberOfWords;
  //int sizeOfArray = strlen(argv[1]);
  printf("Enter how many words:");
  scanf("%d", &numberOfWords);
  char str [numberOfWords][500], temp[500];
  

   printf("Enter your words: ");
  //get # of words
  for (int i = 0; i < numberOfWords; ++i)
    scanf ("%s", str[i]);

  // storing strings in the lexicographical order
  for (int i = 0; i < numberOfWords; ++i){
      for (int j = i + 1; j < numberOfWords; ++j)
	{
	  // swapping strings if they are not in the lexicographical order
	  if (strcmp (str[i], str[j]) > 0)
	    {
	      strcpy (temp, str[i]);
	      strcpy (str[i], str[j]);
	      strcpy (str[j], temp);
	    }
	}
}

  printf ("\nIn the lexicographical order: \n");
  printArray (str, numberOfWords);
  return 0;
}

void printArray (char array[][500], int numberOfWords)
{
  for (int i = 0; i < numberOfWords; ++i)
    {
      printf ("%s \n", array[i]);
    }
}

Em đã in ra thành công như vậy. Nhưng ông thầy e yêu cầu phải sử dụng argument command line để ổng chạy test case:

#include <string.h>
#include <stdlib.h>



int main(int argc, char* argv[])
{


  // int numberOfWords;
  // printf("Enter how many words:");
  // scanf("%d", &numberOfWords);
  char temp[500];
  int i,j;
  argv[i][j];


  //printf("Enter your words: ");
  //get # of words
  for (int i = 1; i < argc; ++i)
    scanf ("%s", argv[i]);
 
  // storing strings in the lexicographical order
  for ( i = 0; i < argc; i++)
    {
      for ( j = i + 1; j < argc; j++)
	{
	  // swapping strings if they are not in the lexicographical order
	  if (strcmp (argv[i], argv[j]) > 0)
	    {
	      strcpy (temp, argv[i]);
	      strcpy (argv[i], argv[j]);
	      strcpy (argv[j], temp);
	    }
	}
}

  printf ("\nIn the lexicographical order: \n");
  for (int i = 1; i < argc; i++)
    {
      printf ("%s \n", argv[i]);
    }
  return 0;
}

Em đã đổi lại thành như thế này biến argv[] thành 2D array. Như nó k hiển thị kết quả như trên


. Mọi người giúp em với, em cảm ơn mọi người nhiều ạ

Trong argv đã có hết rồi :smiley: Bỏ chỗ này đi.

Thêm một vấn đề nữa là bạn không thể tùy tiện tráo đổi nội dung trong argv (tức là *(argv[i])), vì không biết mỗi ô bao nhiêu bytes. Chỉ cần tráo đổi các ô với nhau thôi.

Cuối cùng tham số truyền vào bắt đầu từ argv[1] tới argv[argc-1] :slight_smile:

3 Likes

cảm ơn a đã góp ý.
em đã bỏ phần scanf đi rồi ạ
còn tham số truyền vào em cũng đã nâng từ i = 0 lên i = 1 rồi nhưng nó vẫn k hiện lên như cũ ạ.

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



int main(int argc, char* argv[])
{


  char temp[500];
  int i,j;
  // storing strings in the lexicographical order
  for ( i = 1; i < argc; i++)
    {
      for ( j = i + 1; j < argc; j++)
	{
	  // swapping strings if they are not in the lexicographical order
	  if (strcmp (argv[i], argv[j]) > 0)
	    {
	      strcpy (temp, argv[i]);
	      strcpy (argv[i], argv[j]);
	      strcpy (argv[j], temp);
	    }
	}
}

  printf ("\nIn the lexicographical order: \n");
  for (int i = 1; i < argc; i++)
    {
      printf ("%s \n", argv[i]);
    }
  return 0;
}

@khoi bạn vẫn chưa làm đúng điều này.

2 Likes

Tại e vẫn chưa hiểu sự khác nhau giữa tráo đổi nội dung vs tráo đổi ô là ntn ạ. E thấy cả 2 giống nhau.
Nội dung là các kí tự đặt trong ô mà pk ạ?

Cảm ơn a rogp10 đã góp ý, e đã hiểu ý a rồi.

#include <string.h>
#include <stdlib.h>


void swap1(char **str1_ptr, char **str2_ptr)
{
char *temp = *str1_ptr;
*str1_ptr = *str2_ptr;
*str2_ptr = temp;
}

int main(int argc, char* argv[])
{
  // storing strings in the lexicographical order
  for (int i = 1; i < argc; i++)
    {
      for ( int j = i+1; j < argc; j++)
	{
	  // swapping strings if they are not in the lexicographical order by pointer
	  if (strcmp (argv[i], argv[j]) > 0)
	    {
	      swap1(&argv[i], &argv[j]);
         }
	}
}
  printf ("\nIn the lexicographical order: \n");
  for (int i = 1; i < argc; i++)
    {
      printf ("%s \n", argv[i]);
    }
  return 0;
}

Tráo đổi ô ý a có phải là tráo đổi con trỏ đk ạ?. E đã đổi rồi, nhưng nó bị ra lỗi o.O

2 Likes

cảm ơn mng, e đã fix được lỗi. tại e để telex nên nó bị vậy :blush:

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?