簡體   English   中英

C從字符串中刪除字符

[英]C delete chars from string

我有要求輸入字符串(mystring)和字符(ch)的程序。 然后,它從字符串(mystring)中刪除所有輸入的字符(ch)。 例如“ abcabc”和字符“ a”,則結果應為“ bcbc”。 -當我使用scanf時,如果字符串沒有空格,則程序運行良好。 如果我輸入“ abc abc abc”,它將僅讀取和處理前3個字母(直到空格)。 然后建議我使用gets(mystr); 因為它可以讀取所有攪拌器 但是當我使用gets時,結果與輸入字符串相同,什么也沒發生。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 100

int main(int argc, char *argv[])
{
   char mystr[N] ,result[N];
   char ch;
   int i,k;
   k=0;

   printf("enter string \n");   
   //gets(mystr);///////////////////////////
   //scanf("%s",&mystr);///////////////////
   printf("enter char \n");  
     scanf("%c",&ch);
     scanf("%c",&ch);

  for ( i = 0; i <= strlen(mystr); i++ )
  {
    if (mystr[i] != ch)
    {
      result[k]=mystr[i];
      k++;
    } 
  }
   puts(result);
   system("pause");
   return 0;
}
 scanf("%c",&ch);
 scanf("%c",&ch);

第二個scanf是您的問題。 它拾取您要刪除的字母之后輸入的換行符(並覆蓋ch的先前值)。

擺脫它。

請注意,如手冊頁所述:

永遠不要使用gets() 因為無法不事先知道數據就無法知道將讀取多少個字符gets(),並且因為gets()將繼續存儲超過緩沖區末尾的字符,所以使用它非常危險。 它已被用來破壞計算機的安全性。 使用fgets()代替。

嗯-不知道是什么問題-使用getstr,但不對字符串使用scanf,它在Visual Studio中對我有用

int main(int argc, char *argv[])
{
   char mystr[N] ,result[N];
   char ch;
   int i,k;
   k=0;

   printf("enter string \n");   
   gets(mystr);///////////////////////////
   //scanf("%s",&mystr);///////////////////
   printf("enter char \n");  
     scanf("%c",&ch);
    // scanf("%c",&ch);

  for ( i = 0; i <= strlen(mystr); i++ )
  {
    if (mystr[i] != ch)
    {
      result[k]=mystr[i];
      k++;
    } 
  }
   puts(result);
   system("pause");
   return 0;
}

使用這個:

char temp[2];
scanf("%1s",temp);
ch = temp[0];

和使用gets

char s一起使用時, scanf有一些問題(它獲得了“舊”新行)。 在這里,我們“作弊”了一點,我們使用scanf來獲得一個字符串,該字符串最多可以包含一個字符。 一個1字符的字符串顯然需要第二個字符作為終止符,因此需要2個字符的數組。

請注意,使用scanf搜索字符時,將無法插入空格字符。

請注意, gets是一個“邪惡”函數。 您可以使用它輕松地進行緩沖區溢出(它不會檢查緩沖區是否足夠大)。 通常,“正確”的方法是: fgets(mystr, N, stdin); gets的“文件”變體具有最多可讀取的字符數,並將在末尾附加\\0 )。 請注意,如果您在fgets插入150個字符,則字符串中將包含99個字符(因為您提供了100個最大大小),將附加1x \\0 ,其他字符將保留在緩沖區“ ready”中,以便進行下一個scanf / gets / fgets ...(進行測試,將緩沖區減小到一個較小的值,例如5個字符,並進行一些測試)

您可以按照xanatos的建議使用fgets()並進行一些改動,以便可靠地處理返回字符。 只需將使用fgets獲得的字符串中的'\\ n'更改為'\\ 0'。

並且在程序中,您忘記了以'\\ 0'終止新字符串。 所以這是您要查找的代碼。

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

#define N 100

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

char string[N],str1[N];
char ch;
int i,k = 0;

fgets(string,N,stdin);
string[strlen(string)-1] = '\0';
scanf("%c",&ch);

printf("\n%s , %c",string,ch);
for (i=0;i<=strlen(string);i++)
    if(string[i] != ch)
        str1[k++] = string[i];  

str1[k] = '\0'; 
printf("\n%s , %s\n",string,str1);
return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM