簡體   English   中英

用C語言在字符串中查找字符的堆棧

[英]stack with finding character inside string in C language

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

main()
{
  int i;
  int *b, *z;
  char name[30];
  char vowel[5] = {'A', 'E', 'I', 'O', 'U'};
  char consonants[23] = {'B','C','D','F','G','H','J','K','L','M','N','P','Q','R','S','T','V','W','X','Y','Z'};

  printf ("input the string: ");
  scanf  ("%s", name);
  printf ("The string is %s\n", name);

  for (i=0; name[i]!='\0'; i++){
    if
      (b=strchr(vowel, name[i]) != NULL) {
      printf ("The vowels are:  %s\n", b); }
    else if
      (z=strchr(consonants, name[i]) != NULL) {
      printf ("The consonants are:  %s\n", z);
    }
  }
}

我試圖找出數組中有多少個元音和輔音。 那是我們的老師向我們展示的唯一算法,但是沒有用。 任何人都可以指出我的錯誤嗎?

根據您的所有建議,我再嘗試了一次,

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

int main()
{
int vow, cons, i;
char *s, *s1;
char name[30];
char vowel[6] = "AEIOU";
char consonants[21] = "BCDFGHJKLMNPQRSTVWXYZ";

printf ("input the string: ");
scanf  ("%s", name);
printf ("The string is %s\n", name);
for (i=0; name[i]!='\0'; i++)
s = strchr(vowel, name[i]);
printf ("The vowels are:  %s\n", s);

s1 =strchr(consonants, name[i])) {
printf ("The consonants are:  %s\n", s1);
}

return 0;

}

在您的所有建議下,這就是我的更改方式,我還有其他問題嗎? 原因仍然無法正常工作。 謝謝。

這是我的另一個程序版本

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

 int main()
 {
 int i;
 int counter=0, counter2=0;
 char *s;
 char name[30];
 char vowel[6] = "AEIOU";
 char consonants[21] = "BCDFGHJKLMNPQRSTVWXYZ";

 printf ("input the string: ");
 scanf  ("%s", name);
 printf ("The string is %s\n", name);
 for (i=0; name[i]!='\0'; i++) {
 if (s = strchr(vowel, name[i])) {
 counter++;
 }
 else if (s =strchr(consonants, name[i])) {
 counter2++;
 }
 printf ("First counter is %d\n", counter);
 printf ("The second counter is %d\n", counter2);
 return 0;
 }
  }

我添加了計數器來計算元音和輔音的數量,但仍然無法正常工作。

strchr()用於搜索字符串。

char vowel[] = "AEIOU";
char consonants[] = "BCDFGHJKLMNPQRSTVWXYZ";
#include< stdio.h>
int main()
{
    int vowel=0,consonant=0;
    printf ("input the string: ");
    scanf  ("%s", name);
    printf ("The string is %s\n", name);
    for(int i=0;name[i] !='\0';i++)
    {
        if( name[i] == 'A' || name[i] == 'E' || name[i] == 'I' || name[i] == 'O' || name[i] == 'U' )    
        {
            vowel++;
        }
        else
            consanant++;
    }
    printf("%d %d",vowel,consonant);
    return 0;
}

編譯此代碼時,收到以下消息:

$ gcc -Wall vc.c
vc.c:4:1: warning: return type defaults to ‘int’ [-Wreturn-type]
vc.c: In function ‘main’:
vc.c:17:8: warning: assignment makes pointer from integer without a cast [enabled by default]
vc.c:17:3: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
vc.c:18:4: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int *’ [-Wformat]
vc.c:20:13: warning: assignment makes pointer from integer without a cast [enabled by default]
vc.c:20:3: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
vc.c:21:4: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int *’ [-Wformat]
vc.c:24:1: warning: control reaches end of non-void function [-Wreturn-type]

因此,首先要確保main的返回類型為'int'

int main(){

並在函數底部添加一個返回值

return 0;

之后,將b和z設置為char * s,以便它們與strchr的返回類型匹配

char *b, *z;

這將消除所有警告。

$ gcc -Wall vc.c
$

優秀的。 現在,當我們運行您的程序時:

$ ./a.out 
input the string: aaa
The string is aaa
Segmentation fault

“分段錯誤”表示您正在用盡數組末尾並讀取您不擁有的內存。 現在實施Ignacio Vazquez-Abrams的解決方案

char vowel[] = "AEIOU";
char consonants[] = "BCDFGHJKLMNPQRSTVWXYZ";

現在您的程序將運行完成。

$ ./a.out 
input the string: AAA   
The string is AAA
The vowels are:  AEIOU
The vowels are:  AEIOU
The vowels are:  AEIOU

但這並沒有太大作用,是嗎?

因此,如果您只是想計算有多少個元音和輔音,您可以為每個元音添加一個整數,每當找到正確的類型時它就會遞增,並在最后輸出:

printf("Vowels:\t%d\nConsonants:\t%d", vowelsFound, consonantsFound);

但是,如果您嘗試將它們輸出為列表,則將需要做更多的數據操作。 一些鏈接簽出:

用於printf的Linux手冊頁

用於字符串功能的Linux手冊頁

您已將return語句放置在for循環中,以防止其掃描整個name數組。

使用strchr ,您還需要將當前循環字符轉換為大寫字母,以使其正確匹配,因為您已經定義了大寫的vowels 要使用toupper()您需要包含ctype.h

您也不需要定義consonants 不是元音的是輔音。

這是代碼。 我已經對其進行了測試,並且可以正常工作:

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

int main()
{
    int i;
    int counter=0, counter2=0;
    char *s;
    char name[30];
    char vowel[6] = "AEIOU";

    printf ("input the string: ");
    scanf  ("%s", name);
    printf ("The string is %s\n", name);
    for (i=0; name[i]!='\0'; i++) {
        if (strchr(vowel, toupper(name[i])) != NULL) {
            counter++;
        }
        else {
            counter2++;
        }
    }
    printf ("First counter is %d\n", counter);
    printf ("The second counter is %d\n", counter2);
    return 0;
}

或者。

#include <stdio.h>
#include <string.h>
int main() {
 int t [256];
 int i,c;
 int cntw = 0;
 int cntc = 0;
 const char * vowel="AEIOUaeiou";
 const char * consonants="BCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz";
 memset(t,0,256);
 while (*vowel) { t[*vowel] = 1; ++vowel;}
 while (*consonants) { t[*consonants] = 2; ++consonants;}
 printf ("Input the text:  CTRL-D to end\n");
 c = getchar();
 while(c >=0) {
  switch(t[c]) {
   case 1: ++cntw; break;
   case 2: ++cntc; break;
  }
  c=getchar();
 }
 printf ("Text has %d vowel%s and %d consonant%s\n",
  cntw,(cntw>1)?"s":"",
  cntc,(cntc>1)?"s":"");
 return 0;
}

暫無
暫無

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

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