• 締切済み

文字列をポインタに入れる方法を教えてください。

どなたか文字列をポインタに入れる方法を教えてください。下のプログラムのa=count(name1);とreverse(name1,name2,a);のとこにエラーが表示されます。ちなみに&を入れてもダメでした。整数の場合は&を入れたらできるみたいですが、文字列となるとやり方が違うのでしょうか? 問題としてはローマ字で名前を入力して表示し、文字数と名前を逆順にする2つの関数countとreverseを各自定義してそれぞれ定義しプログラムを組みなさい。姓と名の間は1文字空白を入れ、空白は文字数に含めないこと。 下のプログラムを実行させると・・・ 名前を入力しなさい。 yamada hirosi //自分で入力 yamada hirosi 文字数は12 逆順にした後はisorih adamay となるはずなんですが、なりません。どなたか宜しくお願いします。 #include "stdafx.h" #include <stdio.h> int count(char *name1[]) { int i,b=0; for(i=0;*name1[i]!='\0';i++) { b++; } b--; return b; } void reverse(char *name1[],char *name2[],int a) { int w; for(w=0;w<=a;w++) { *name2[w]=*name1[a-w]; } *name2[w]='\0'; } int main(int argc, char* argv[]) { char name1[80],name2[80]; int a; printf("名前を入力しなさい\n"); gets(name1); printf("%s\n",name1); a=count(name1); printf("文字数は%d\n",a); reverse(name1,name2,a); printf("逆順にした後は%s\n",name2); return 0; }

みんなの回答

  • yama5140
  • ベストアンサー率54% (136/250)
回答No.2

>どなたか文字列をポインタに入れる方法を教えてください。  う~ん、「ポインタに入れる」とはなんだろう。  質問主旨は、「配列」は判ったから「ポインタ」を勉強してみよう、ということかな。  というか、示された関数2つ、「配列」の面影残しすぎ・・。  てか、void reverse() は、「配列」でないと・・「戻り値」はないのだから。 ☆「配列」で自分の思うことが(十分簡単に)実現できると判ったなら、それで十分と思うけど・・。   int count( char name1[] )   {      int i;      for( i = 0; i < 80; i++ ){        if( '\0' == name1[i] )  break;      }      return( i - 1 ); // 「空白は文字数に含めない」   } または、   int count( char name1[] )   {      return( strlen( name1 ) - 1 );   } -------------------------------------------- >下のプログラムの a=count(name1); と reverse(name1,name2,a); のとこにエラーが表示されます。  そこに「エラーがある」から「エラーが表示され」た訳ではないと思います。  コンパイラは、ソースの頭から解釈していって、前方で定義された関数の「形式」と、ソースの後方にあった当該関数の「呼び出し方」が合わないから、(「合わない」と判った所で)エラーを表示した、だけだと思います。  (エラー:警告を含めた広義のエラー)  質問者様のソースでは、    int count( char *name1[] ) とした関数を、(ソース後方 main で)a = count( name1 ); と呼び出している。    ↑コンパイラは、ソースの前方にあるものを正しいとする(しかない)から、ありゃりゃ???、なんでこんな呼び出し方すんのと・・。 -------------------------------------------- gets() が「読み取った改行文字は捨て」るので、gets() を使わずに(今回の本質でない)、ソースを書いて(BorlandC++5.6.4)みました。  http://www.bohyoh.com/CandCPP/C/Library/gets.html #include <stdio.h> int count( char *name1 ) {  int b = 0;  while( *name1 ){ // 「文字」がヌルでない間ループ   b++;   name1++; // char 型なので1バイト次へ  }  return( b ); // 途中の空白1文字も「処理」に必要◆ } void reverse( char name1[], char name2[], int a ) {  int w;  for( w = 0; w < a; w++ ){ // 途中の空白1文字分も◆   name2[ w ] = name1[ a - w - 1 ];  }  name2[ w ] = 0x00; } void main() {  char name1[80] = "yamada hirosi", name2[80];  int a;  a = count( name1 );  printf( "%s\n", name1 );  printf( "空白を除く文字数は %d\n", ( a - 1 ) ); // 「空白は文字数に含めない」  reverse( name1, name2, a );  printf( "逆順にした後は %s\n", name2 ); } 注:インデントに全角空白を用いています。タブに一括変換して下さい。

  • arain
  • ベストアンサー率27% (292/1049)
回答No.1

>整数の場合は&を入れたらできるみたいですが、文字列となるとやり方が違うのでしょうか? 単にエラーが出なくなっただけで、問題は解決できていないと思われる。 エラーメッセージのとおり。渡し型が違っている。 count()と、reverse()の作り方に問題がある。 引数を「char *name1[]」としている理由は? ちなみに、正常に動くように変更した場合でも、ソースに一部間違いがあるので注意。

関連するQ&A

  • c言語の文字列の逆順のプログラムがわかりません

    文字列を逆順して出力するプログラミングがわかりません。 #include <stdio.h> #include <string.h> void reverse(char *moji, char *gyaku); int main(void) { char x[30]; char y[30]; puts("文字を入力してください。\n"); scanf("%s", x); reverse(x, y); printf("逆順すると%sです。\n", y); return (0); } void reverse(char *moji, char *gyaku) { int i, len; len = strlen(moji); gyaku = moji + len - 1; for(i = 0; i < len; i ++){ putchar((int)*gyaku); gyaku--; } } 理想とする実行結果は 文字を入力してください。 abcdefg 逆順するとgfedcbaです。 なんですが、 上記のソースを実行すると 文字を入力してください。 abcdefg gfedcba逆順すると(謎の漢字)です。 となります。 どこがおかしいんでしょうか? よろしくおねがいします。

  • 文字列の入力

    文字列(名前)と誕生日を読み込み、表示するプログラムです。文字列を読み込むときに空行を入力すると、読み込みを終了して表示するようにしたのですが、うまくいきません。読み込む時に使う関数が違うのだと思います。scanfとgets、fgetsは試したのですが、だめでした。 教えてください。 #include <stdio.h> #include <stdlib.h> #include <string.h> #define DATA 3 int main() { char *name[DATA]; char work[31]; int month[DATA]; int day[DATA]; int count1,count2; printf("Data #1\n"); printf("name ="); fgets(work,31,stdin); for(count1=0;(work[0]!='\n')&&(count1<DATA);count1++){ printf("month ="); scanf("%d",&month[count1]); printf("day ="); scanf("%d",&day[count1]); name[count1]=(char *)malloc((strlen(work)+1)*sizeof(char)); strcpy(*(name+count1),work); printf("\n"); if(count1<DATA-1){ printf("Data #%d\n",count1+2); printf("name ="); fgets(work,31,stdin); } } for(count2=0;(count2<DATA)&&(count2<count1);count2++){ printf("Data #%d\n",count2+1); printf(" name: %s\n",*(name+count2)); printf(" birthday: %2d %2d\n",month[count2],day[count2]); } }

  • 10進数文字列の変換

    #include <stdio.h> unsigned int chg(char *); main() {      char m[6] unsigned int value; printf("変換する10進数文字列の入力\n"); gets(m); value =chg(m); printf("%d", value); } unsigned int chg(char *p) { unsigned int w; w = 0; while(*p){ w = w * 10 + *p - '0'; p++; } return w; } aを入力すると49が出力されるのですが unsigned int w; w = 0; while(*p){ w = w * 10 + *p - '0'; p++; } の部分の処理なのですが どのように49に変換している のかが今ひとつ分かりません。 どなたかご教授よろしくお願いいたしますm(_ _)m

  • プログラム

    文字列を逆順にする関数を作ってるのですがうまくできません。 void reverse(char *str, int count=0) { int i; char *s="momonga"; s+=strlen(s); count=strlen(s); for(i=count; i<0; i--, str++, s--){ *str++=*s++; } } int main() { char s1[20]; int c; reverse(s1,c); printf("%momongaを逆順にすると%sで文字数が%dです",s1,c); return 0; } このプログラムの間違ってる所をおしえてください。

  • C言語 文字列の操作

    文字Cが含まれる個数を求めたいです #include <stdio.h> int str_chnum(const char str[],int c) { int i; int count=0; for(i=0;str[i]!="\0";i++) if (str[i]==c) count++; return(count); } int main(void) { char st[100]; printf("検索文字列を入力してください:"); scanf("%s",st) ; printf("検索文字列数は%uです。\n",st,int str_chnum(const str[],int c)); return(0); } コンパイルできません。なぜですか?printfの行がたぶん間違っていると思うんですが。。。

  • 文字列について

    textファイルをいくつかに分割して保存しようと思い、以下のプログラムを作りましたが、うまくいきません。 予定では "0000.txt", "0001.txt", ....と文字列を生成するはずです。 #include <stdio.h> #include <string.h> #define LENGTH 4 //番号の桁数 void filename(int n) {    char name[LENGTH +4 +1];    char text[5] = ".txt";    int i;    for(i = 0; i <= LENGTH; i++)       name[i] = '0';    i = LENGTH;    //自然数を文字列に変換    do{       name[i] = (char)(n%10 + 48);       i--;       n /= 10;    }while(n != 0 && i >= 0);    strcat(name, text);    printf("filename:%s", name); } int main(void) {    int i;    for(i = 0; i < 5; i++){       filename(i);       printf("\n");    }    return 0; } 実行結果は filename:00000@.txt filename:00001.txt filename:00002.txt filename:00003.txt filename:00004.txt このように、文字化けしています。 何が原因なのでしょうか。 よろしくお願いします。

  • 文字列

    下のプログラムは何をするためのプログラムなのか教えてください。 個人的にはJISコードに関係していると思うのですがさっぱりわかりません。 どなたか詳しい説明お願いします。 #include <stdio.h> #define LEN 255 int main(void) { char str[LEN]; char cipher[LEN]; int ikey; int i,n; printf("文字列を入力せよ : "); scanf("%s", str); printf("鍵を入力 : "); scanf("%d", &ikey); i = 0; while (str[i]!='\0') { n = (str[i]-'A'+ikey)%26; cipher[i] = 'A'+n; ++i; } cipher[i] = '\0'; printf("%s\n", cipher); return 0; }

  • 文字列の比較

    このプログラムに問題はあるでしょうか? 2つの文字列に対して,同じ位置にある文字が一致する箇所をカウントするプログラムです. やはりwhile分の||を&&にしなければならないのでしょうか? #include <stdio.h> int main(void) { char mojiA[] = "Please Help Me!" ; char mojiC[] = "eeeeeeeeeeeeeeeee"; char mojiB[] = "Please give me some money" ; int count ; /* 一致した文字数 */ int i ; count = 0 ; i=0; do{ if (mojiA[i] == mojiB[i]) {          count++ ;        } i++; } while(mojiA[i]!=0 || mojiB[i]!=0); printf("%d\n", count) ; return 0 ; } ;

  • ポインタ

    文字列"apple", "orange", "strawberry"へのポインタをポインタ配列の各要素に代入した後,その文字列の文字を逆順に表示するようにプログラムを考えているのですが、 while文の中のjはそれぞれについて考える必要がありますか? ポインタを使って文字数を数得られそうですが出来ませんでした。 [実行例] ポインタ配列[0]の文字列の逆はelppaです. ポインタ配列[1]の文字列の逆はegnaroです. ポインタ配列[2]の文字列の逆はyrrebwartsです. #include<stdio.h> #define COUNT 3 int main(void) {   char * words[COUNT] = {"apple", "orange", "strawberry"};   int i, j;   for(i = 0; i < COUNT; i++) {    j =  ?  ;    printf("ポインタ配列[%d]の文字列の逆は", i);    while(   ?   ) {     printf("%c", *(words[i] + j));     j--;    }    printf("です.\n");   }   return 0; }

  • ポインタ文字列をchar[ ]の文字列へ変換する方法

    C言語の問題で悩んでいます。 ポインタ型で受け取った文字列を、通常の配列に変換し、それぞれの文字列がいくつ使われているというプログラムを組みたいのですが、うまくいきません。 とりあえずここまでのソースを。 #include <stdio.h> int count[95]={0}; void Countx(void){ int x; for(x=0;x<=95;x++){ if(count[x]!=0){ printf("'%c': %d\n",x+32,count[x]); } } } void County(char *str){ int c; for(c=0;c<=20;c++){ count[c+32]=str[c]; } } int main(void){ County("I am a BILL."); Counxt(); return 0; } "I am a BILL"の部分が以下のように ' ':3 '.':1 'a':2 というふうにそれぞれの文字と、利用された回数を出すようにプログラムを組みたいのですが、上記のままだとが ' ':84 '!':104 '"':105 と言う風に、文字コードが空白から順番に、右の回数の部分はなぞの数字が表示されてしまいます。 どうか理想どおりの結果が出るようにする方法を教えてください。 よろしくお願いします。