• 締切済み

CString のGetAt で正しく文字が取れない

orc-orcaの回答

  • orc-orca
  • ベストアンサー率68% (15/22)
回答No.1

 うーん,わたしなら,OutputDebugString()とかで,i, s1, cc, c2 等のトレースを取りながら実行してみます.前スレによると,これはあるコードの一部を抜き出したもののようなので,他のコードが悪影響している可能性があるからです. # GetAt() がリリース時に範囲チェックを行なわないのは,単純に速度を重視したためでしょう.

参考URL:
http://www.nitoyon.com/vc/tutorial/debug/win32.htm
hibachi
質問者

補足

回答ありがとうございます。 チェックした結果、ccとc2のアドレスが隣り合っていた事 + '\0'が終端に確保されていなかった為に、変数使用側で誤作動を起こしていたと思われます。失礼しました。

関連するQ&A

  • 文字の表示なのですが

    int i; int len = length[n]; for( i = 0; i <= len; i++ ){ printf("%c ", path[n][i] + 'A' ); } printf("%c\n", goal + 'A' ); } このままだと、 ABCDEFGHIJ・・・の順に表示されてしまいます。 SABCDEFGHI・・・と表示したいのですがどのようにすればいいのでしょうか。

  • C言語で文字配列の問題がわかりません

    初めて質問します。最近、C言語の勉強をし始めた者ですが、今回「20字以上の行を全て印字せよ。」という演習プログラムを書いています。 専門書の方では文字配列の単元の演習問題なのですが、例題を参考にして以下にここまでは自力で書きました。しかしこのソースコードに対して実行したところ、どうやら「20字以上ある行の、次の行」が印字されているようで、全く原因がわかりません。 putcharの使用が必須だったのですが、試しに関数putlineを消して printf("%s",line); で出力してみるとうまくいきました。どうやら関数putlineに問題があると思っているのですが(ここは完全に自力だったため^^;)、ご指摘、アドバイス頂けると光栄です。 よろしくお願いしますm(_ _)m #include<stdio.h> #define MAXLINE 1000 int getline (char s[], int lim) { int c,i; for (i=0; i<lim-1 && (c=getchar()) !=EOF && c!='\n'; i++){ s[i]=c; } if (c= ='\n'){ s[i]=c; i++; } s[i]='\0'; return i; } int putline (char t[]) { int c,i; for (i=0; (c=getchar()) !=EOF && c!='\n'; i++){ t[i]=c; putchar(t[i]); } if (c= ='\n'){ t[i]=c; putchar(t[i]); } return 0; } main() { int len; char line[MAXLINE]; while( (len=getline(line,MAXLINE) )>0 ){ if (len>20){ putline(line); } } }

  • 配列の配列?

    80字より長い行を全て印字するというプログラムを作ろうと思います。 それで今現在下記の状態なんですが #include <stdio.h> #define MAXLINE 1000 int getline(char line[], int maxline); void copy(char s1[], char s2[]); int main(int argc, char* argv[]) { int len; int max; char line[MAXLINE]; char longest[MAXLINE]; max = 0; while((len = getline(line, MAXLINE))> 0){ if(len > 80){ max = len; copy(longest, line); } } if(max > 0){ printf("%s", longest); } return 0; } int getline(char s[], int lim) { int c, i; for(i = 0; i < lim -1 && (c = getchar()) != EOF && c != '\n'; ++i){ s[i] = c; } if(c == '\n'){ s[i] = c; ++i; } s[i] = '\0'; return i; } void copy(char s1[], char s2[]) { int i; i=0; while((s1[i] = s2[i]) != '\0'){ ++i; } } この状態だと80字以上の行を1行しか表示しません。 おそらくは配列の配列を使って保存しておくのだとは考えたのですが 使い方がわかりません。教えて下さい。

  • 文字列

    下のプログラムは何をするためのプログラムなのか教えてください。 個人的には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; }

  • 文字列の扱い方

    初歩的な質問ですみません… str文字列からcという文字を見つけたら添字を返すという関数を作ったのですが、 iにこの関数を代入して、if文の制御式にiを使って比較するまでは正常なのですが、 真文にiを使うと何故か偽文(という言い方でいいのでしょうか…この場合("そんな値はありません。"というところです)が実行されてしまいます。 よろしければご教授お願い致します。 #include <stdio.h> int str_char(const char str[],int c) { int len = strlen(str); int i; for (i = 0;i < len;i++) { if (str[i] == c) return i; } return -1; } int main() { char str[64] = "Fucking Brutal Death Metal"; int ch,i; printf("どの文字を調べますか?"); scanf("%c",&ch); i = str_char(str,ch); if (i >= 0) printf("その文字は%d番目にあります。",str_char(str,ch) + 1); //何故かiだと動かない else printf("そんな値はありません。"); return 0; }

  • プログラミング(配列と関数の引数)

    a : ABCDE a : ABCDEFGH Len : 8 a : FGHIJ a : FGH a : FGH, c : FGH 上記のように表示されるプログラムを作りたいのですが、なかなかできません。下記のようなプログラムを作ったのですがどこが間違っているのかよくわかりません。分かる方、指摘をお願いします。 #include <stdio.h> void my_strcpy(char s[], char t[]); int my_strlen(char s[]); void my_strcat(char s[], char t[]); int main(){ char a[10]; char b[10] = "ABCDE"; char c[] = "FGH"; int len; my_strcpy(a, b); printf("a : %s\n", a); my_strcat(a, c); printf("a : %s\n", a); len = my_strlen(a); printf("Len : %d\n", len); my_strcpy(a, "FGHIJ"); printf("a : %s\n", a); a[3] = '\0'; printf("a : %s\n", a); if(strcmp(a, c) == 0){ printf("a : %s, c : %s\n", a, c); } int i, s, t; my_strcpy(a, b + 2); printf("a : %s\n", a); void my_strcpy(char s[], char t[]){ for (i = 0; t[i] != '\0'; i++){ s[i] = t[i]; } s[i] = '\0'; } int my_strlen(char s[]){ int i; for (i = 0; s[i] != '\0'; i++); return i; } void my_strcat(char s[], char t[]){ int i, j; for (i = 0; s[i] != '\0'; i++); for (j = 0; t[j] != '\0'; i++, j++){ s[i] = t[j]; } s[i] = '\0'; } }

  • C言語で、文字の出現頻度を求める問題がわかりません

    #include <stdio.h> int main(void) { char ss[80],ascii[128]; int len,i; for(i=0;i<128;i++){ ascii[i]=0; } printf("Input the string : "); scanf("%s",ss); len=strlen(ss); for(i=0;i<len;i++){ ???//その文字のアスキーコードがi番であればascii[i]の値をインクリメント; } for(i=0;i<128;i++){ if(ascii[i]>0){ printf("%c : %5.2f % \n",i,???);//???には出現割合の計算式 } } return 0; } 結果例 入力 aaaa000bbT 出力 a : 40.00% 0 : 30.00% b : 20.00% T : 10.00% ???の部分がわかりません・・・ テストにでるとのことなので焦ってます;;

  • 文字列クラスを作りたいと思っています

    文字列クラスを作りたいと思っています。 以下のようなところまでは作れましたが、 エラーがでてしまいます。 どこかおかしいところがあるのでしょうか? *********************************************** #include<stdio.h> #include<string.h> class stt { public: char *str; int len; bool maked; stt::stt() { len=0; str=NULL; maked=false; } stt::~stt() { delete[] str; } stt &operator =(char *c) { if(maked) { delete[] str; maked=false; } len=strlen(c); str=new char[len]; strcpy(str,c); maked=true; return (*this); } virtual operator char*() { return str; } }; int main() { stt s; s="Hello World"; printf(s); getchar(); return 0; } ***********************************************

  • ポインタの引数について。

    C言語初心者です。 既存のプログラムを直そうとしているのですが、ポインタの概念がいまいち理解できていないのか、修正した箇所がうまく動きません。 どうすればよいかをご教示いただけませんでしょうか。 元のプログラムは void sub() { SOCKET s; struct msg r_msg; int time; int cc; cc = sub_recv(s, &r_msg, time); ・・・ } void sub_recv(s,*msg,time) { unsigned char *pack; int cc; int len; pack = (unsigend char *)msg cc = recv(s, (char *)pack, len, 0); if(cc < 0) return(cc); ・・・ } という感じでr_msg構造体にrecvで受け取ったものを入れて行きます。 ccにはrecv()の戻り値でサイズが返ってきて直後のifにはひっかかりません。 構造体の中でサイズが固定されているため、可変にするために以下のようにしたいです。 extern int buflen; void sub() { SOCKET s; unsigned char *r_msg; int time; int cc; r_msg=(char *)malloc(sizeof(char)*buflen ); cc = sub_recv(s, r_msg, time); free(r_msg); ・・・ } void sub_recv(s,*msg,time) { unsigned char *pack; int cc; int len; pack = (unsigend char *)msg /*ここの代入は無意味と思いますがなくしても同様の結果のなので残してます。*/ cc = recv(s, (char *)pack, len, 0); if(cc < 0) return(cc); ・・・ } しかし、このような修正で*r_msgにはrecv()で受け取った内容が入る気がするのですが、 ccには-1が入ってしまい、ifに引っかかって終了してしまいます。 この時のerrnoを見ても104が入り、connection reset by peerといった感じです。 recv()の第二引数にはこれがバッファが用意されてればいいと解釈しておりますが、 これではバッファが1バイトしかとれていないなどあるのでしょうか。 因に、send()がないからというのはありません。 キャストが間違えているなどもあるかもしれませんが、宜しくお願いします。

  • C言語の文字列について

    abcdefghという文字列を入力した時に以下のように表示させたいのですがわかりません。(入力した文字を逆から表示させて、且つ文字数を4分割させて改行させる) hg fe dc ba 自分で考えたソースは以下のようです。(これではhgfedcbaと表示するだけなのです)どうしてもわからないので教えてください。宜しくお願いします。 #include <stdio.h> #include <string.h> int main(void) { char input[20]; size_t len,h,k,j; size_t i; gets( input); len=strlen(input); h=len/5; k=h; for(j=1; j<=5;++j) { for(h=k*(j-1); h<k*j; ++h) { printf( "%c", input[len - h - 1]); } } scanf( "%20s", input); return 0; }