【问题标题】:Insert integer in middle of pointer string in C在C中的指针字符串中间插入整数
【发布时间】:2020-09-04 04:40:44
【问题描述】:

我有一个名为 pos 的字符串,我想在字符串中间插入整数。我是 C 的新手。
我的代码是

char *pos;
int i = 1;

pos = "(%d)",i;
printf("%s",pos);

我得到这个输出(%d)
而我想要(1)
如果我的方法有误,请纠正我。
我知道我可以直接打印,但我想在程序中使用变量。


编辑:我已经从 C++ 切换,我还没有阅读太多关于指针的内容
函数定义定义在int program_list(char *programs[],int program_len,int progress[],int progress_len)
顺便说一句,我的整个程序是

#include <stdlib.h> // exit()
#include <stdio.h>
#include <string.h>
#include <conio.h> // clrscr(), getch()

#define width 68
#define array_size(arr) ((sizeof(arr))/(sizeof(*arr)))

void ln();
int program_list(char *programs[],int program_len,int progress[],int progress_len);
void get_elements(int arr[],int size);
void display_elements(int arr[],int size);
int insert_element(int arr[],int *size,int pos,int item);
int delete_element(int arr[],int *size,int pos);
int linear_search(int arr[],int beg,int last,int item);
int binary_search(int arr[],int beg,int last,int item);
void swap(int *a,int *b);
int bubble_sort(int arr[],int size);

int main() {
    int item,opt,size,pos,arr[20];
    int progress[] = {6,7,11,14,15,16};
    char *programs[] = {"GCD of 2 nos. using recursion",
                      "Fibonacci series using recursion",
                      "Length of string, concatenate 2 strings using pointer",
                      "Copy a string, extract substring from string using pointers",
                      "Tower of Hanoi with 3 discs using recursion",
                      "Insert integer in array",
                      "Delete integer from array",
                      "Create linked list and display it",
                      "Sort N nos. using insertion sort",
                      "Sort N nos. using selection sort",
                      "Sort N nos. using bubble sort",
                      "Sort N nos. using merge sort",
                      "Sort N nos. using quick sort",
                      "Binary Search using recursion",
                      "Linear Search using recursion",
                      "EXIT"
                     };

    do{
    
       opt = program_list(programs,array_size(programs),progress,array_size(progress));
       
       switch(opt){

          case 1:
             break;

          case 2:
             break;

          case 3:
             break;

          case 4:
             break;

          case 5:
             break;

          case 6:
             printf("\nEnter size of array : ");
             scanf("%d",&size);
             printf("Enter elements of array -:");
             get_elements(arr,size);
             printf("Elements of array -:");
             display_elements(arr,size);
             printf("At which index you want to insert? : ");
             scanf("%d",&pos);
             printf("Enter value which you want to insert : ");
             scanf("%d",&item);
             
             *arr = insert_element(arr,&size,pos,item);
             
             printf("Elements of array after insertion -:");
             display_elements(arr,size);
             
             break;

          case 7:
             printf("\nEnter size of array : ");
             scanf("%d",&size);
             printf("Enter elements of array -:");
             get_elements(arr,size);
             printf("Elements of array -:");
             display_elements(arr,size);
             printf("Enter index which you want to delete : ");
             scanf("%d",&pos);

             *arr = delete_element(arr,&size,pos);

             printf("Elements of array after deletion -:");
             display_elements(arr,size);
             
             break;

          case 8:
             break;

          case 9:
             break;

          case 10:
             break;
             
          case 11:
             printf("\nEnter size of array : ");
             scanf("%d",&size);
             printf("Enter elements of array -:");
             get_elements(arr,size);
             printf("Elements of array -:");
             display_elements(arr,size);
             
             *arr = bubble_sort(arr,size);
             
             printf("Sorted array using bubble sort -:");
             display_elements(arr,size);
             
             break;
             
          case 12:
             break;
             
          case 13:
             break;
             
          case 14:
             printf("\nEnter size of array : ");
             scanf("%d",&size);
             printf("Enter elements of array -:");
             get_elements(arr,size);
             printf("Elements of array -:");
             display_elements(arr,size);
             printf("Enter value which you want to search : ");
             scanf("%d",&item);
             
             pos = binary_search(arr,0,size-1,item);
             if(pos==-1){
                printf("%d not found using binary search\n",item);
             }
             else{
                printf("arr[%d] = %d (found using binary search)\n",pos,item);
             }
             
             break;
             
          case 15:
             printf("\nEnter size of array : ");
             scanf("%d",&size);
             printf("Enter elements of array -:");
             get_elements(arr,size);
             printf("Elements of array -:");
             display_elements(arr,size);
             printf("Enter value which you want to search : ");
             scanf("%d",&item);
             
             pos = linear_search(arr,0,size-1,item);
             if(pos==-1){
                printf("%d not found using linear search\n",item);
             }
             else{
                printf("arr[%d] = %d (found using linear search)\n",pos,item);
             }

             break;

          case 16:
             exit(EXIT_SUCCESS);
             break;

          default:
             printf("Enter valid choice!\n");
             opt=0;

       }
       
       printf("Program finished! Press enter to restart");
       getch(); // use getch() two times for linux based OS (modified by me)
       getch();
       

    }while( opt>=0 && opt<=array_size(programs) );

    return 0;
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void ln(){
   printf("\n");
} // function to leave a line


int program_list(char *programs[],int program_len,int progress[],int progress_len){
   clrscr();
   int opt,i=0,j,k;
   char *text,*status,*pos;
   
   while(i>=0 && i<=2){
      switch(i){
      case 1:
         for(j=0;j<program_len;j++){
            for(k=0;k<=width;k++){
               if(k==0 || k==width) printf("|");
               else{
                  if(linear_search(progress,0,progress_len,j+1)==-1) status="  ";
                  else status="->";
                  pos = "(%d) ",(j+1);
                  text = programs[j];
                  printf("%s%s%s",status,pos,text);
                  k=strlen(status)+strlen(pos)+strlen(text);
                  while(k<width-1){
                     printf(" ");
                     k++;
                  }
               }
            }
            ln();
         }
         break;
      default:
         for(j=0;j<=width;j++){
            if(j==0 || j==width) printf("+");
            else printf("-");
         }
         ln();
      }
      i++;
   }
   printf("\nYour option : ");
   scanf("%d",&opt);
   return opt;
} // function to display list of programs in beautiful manner


void get_elements(int arr[],int size){
   int i;
   ln();
   for(i=0;i<size;i++){
      printf("arr[%d] -> ",i);
      scanf("%d",&arr[i]);
   }
   ln();
} // function to get elements in array


void display_elements(int arr[],int size){
   int i;
   ln();
   for(i=0;i<size;i++){
      printf("arr[%d] = %d\n",i,arr[i]);
   }
   ln();
} // function to display elements of array


int insert_element(int arr[],int *size,int pos,int item){
   if (pos>*size){
      printf("OVERFLOW\n");
   }
   else{
      int i;
      for(i=*size;i>pos;i--){
         arr[i]=arr[i-1];
      }
      arr[pos] = item;
      *size = *size+1;
   }
   return *arr;
} // function to insert element in array


int delete_element(int arr[],int *size,int pos){
   if (pos>*size){
      printf("OVERFLOW\n");
   }
   else{
      *size = *size-1;
      int i;
      for(i=pos;i<*size;i++){
         arr[i]=arr[i+1];
      }
   }
   return *arr;
} // function to delete element from array


int linear_search(int arr[],int beg,int last,int item){
   if (beg<=last){
      if(arr[beg]==item){
         return beg;
      }
      return linear_search(arr,beg+1,last,item);
   }
   return -1;
} // function to search elements using linear search


int binary_search(int arr[],int beg,int last,int item){
   if (beg<=last){
      int mid;
      mid = (beg+last)/2;
      if(arr[mid]==item){
         return mid;
      }
      if(arr[mid]>item){
         return binary_search(arr,beg,mid-1,item);
      }
      return binary_search(arr,mid+1,last,item);
   }
   return -1;
} // function to search elements using binary search


void swap(int *a,int *b){
   int temp;
   temp = *a;
   *a = *b;
   *b = temp;
} // function to swap numbers


int bubble_sort(int arr[],int size){
   int i=0,j;
   while(i<size-1){
      j=0;
      while(j<size-1-i){
         if(arr[j]>arr[j+1]){
            swap(&arr[j],&arr[j+1]);
         }
         j++;
      }
      i++;
   }
   return *arr;
} // function to sort array using bubble sorting

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

我的输出

【问题讨论】:

  • 您是否尝试过通过阅读 C 书籍或教程来正确学习该语言?或者通过搜索关于如何做你想做的事的例子来做任何基础研究?
  • @kaylum 抱歉,我还没有对 C 进行更多研究
  • 没有内置操作可以插入到 C 字符串的中间。您需要将结果放入一个新字符串中。
  • 数组和snprintf? (char pos[16]; snprintf(pos, sizeof pos, "(%d)", i);)
  • 如果您的程序通过代码在内部构造格式字符串,它可以在需要时插入数据,而不是构造格式字符串。如果格式字符串是由用户输入的,那么您应该立即停止,因为这会为您的程序打开各种滥用和安全漏洞。

标签: c string pointers


【解决方案1】:

您不需要pos 变量。只需将您想要的内容放入 printf() 格式字符串中即可。

要获得打印的长度,请使用%n 格式说明符,而不是添加strlen()。见What is the use of the %n format specifier in C?

for(j=0;j<program_len;j++){
    for(k=0;k<=width;k++){
        if(k==0 || k==width) printf("|");
        else{
            if(linear_search(progress,0,progress_len,j+1)==-1) status="  ";
            else status="->";
            text = programs[j];
            printf("%s(%d)%s%n",status,j+1,text, &k);
            while(k<width-1){
                printf(" ");
                k++;
            }
        }
    }
    ln();
}

但如果你真的想要另一个变量,请将其声明为数组,而不是指针。然后使用sprintf() 格式化。

for(j=0;j<program_len;j++){
    for(k=0;k<=width;k++){
        if(k==0 || k==width) printf("|");
        else{
            if(linear_search(progress,0,progress_len,j+1)==-1) status="  ";
            else status="->";
            text = programs[j];
            char pos[20];
            sprintf(pos, "(%d)", i+1);
            printf("%s%s%s%n",status,pos,text, &k);
            while(k<width-1){
                printf(" ");
                k++;
            }
        }
    }
    ln();
}

【讨论】:

  • 非常感谢!使用数组,sprintf 为我工作
  • 第二个代码代替了第一个代码,因为我需要包含它占用的空间,否则 ` | ` 这不会发生在适当的位置
  • 我已经更新了答案,展示了如何在没有 pos 变量的情况下做到这一点。
  • 感谢您花时间解决我的问题,我知道我可以直接打印,但我需要考虑长度,以便它可以适合适当的空间,无论如何谢谢!
  • 我明白这一点。 %n 获取长度并将其放入 k
猜你喜欢
  • 2021-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-08
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
  • 2012-02-06
相关资源
最近更新 更多