実行できません

このQ&Aのポイント
  • Visual Studio 2008でコンパイルしたサンプルプログラムが実行できません。
  • コンパイルは成功し、実行ファイルも生成されますが、実行ができません。
  • 警告メッセージにはアンワインドセマンティクスに関する指示があります。
回答を見る
  • ベストアンサー

実行できません

#include<iostream> #include<cstring> using namespace std; void reverse(char *str,int count=0); int main(){ char *s1="this is a test."; reverse(s1); cout<<s1; return 0; } void reverse(char *str,int count){ int i,j; char temp; if(!count)count=strlen(str)-1; for(i=0,j=count;i<j;i++,j--){ temp=str[i]; str[i]=str[j]; str[j]=temp; } } これはあるサンプルプログラムなのですが、visual studio 2008でコンパイルしたらこのように実行ファイルはできるのですが実行できません。 C:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\xlocale(342) : warning C 4530: C++ 例外処理を使っていますが、アンワインド セマンティクスは有効にはなりま せん。/EHsc を指定してください。 Microsoft (R) Incremental Linker Version 9.00.30729.01 Copyright (C) Microsoft Corporation. All rights reserved. /out:samplem.exe samplem.obj どうしてでしょうか?よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

>char *s1="this is a test."; は「文字列リテラル」と呼ばれるものの値をs1の変数に代入しています。 通常この「文字列リテラル」は「変更してはならない領域」とされていて、 変更したときの振る舞いは「未定義」です。 (C言語の規格として決められていないため、どのような振る舞いをするかは 処理系によってことなる。正しく動くかもしれないし、メモリを壊してしま うかも知れない。) >reverse 関数の中で、「変更してはならない領域」を変更しているわけです。 とりあえず動くようにしたいのであれば、 >char *s1="this is a test."; を char s1[] = "this is a test."; とでもすればいいでしょう。

20081217
質問者

お礼

ありがとうございました。

関連するQ&A

  • abcdとキーボードで打ったらdcbaと表示されるプログラム

    C言語に関しては初心者です。 メイン関数は変更せずに行います。 /* reverse.c: reverse a given string */ #include <stdio.h> #include <string.h> void reverse(char *); /* プロトタイプ宣言 */ int main(void) { char str[100]; scanf("%s", str); reverse(str); printf("%s\n", str); return (0); } void reverse(char *s) { char n; int i; char str; n = strlen(str) - 1; for(i=0,i++,i<=100) { s[i] = *s[n-i]; printf("%s\"s[i]); } }

  • プログラム

    文字列を逆順にする関数を作ってるのですがうまくできません。 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言語で文字の並べ替えをしたいのですが条件があり ポインタを使って文字を並べ替える別の関数をを渡さなければなりません.(void reverse(char *str)をつくる) そこで作ったのが #include <stdio.h> #include <string.h> void reverse(char *str); int main(void){ char s[80]; gets(s); reverse(s); printf("%s\n",s); return 0; } void reverse(char *str){ char q[80]; int i,n; n=strlen(str)-1; str+=n; for(i=0;i<=n;i++)q[i]=*str--; str++; q[i]='\0'; for(i=0;i<=n;i++)*str++=q[i]; } なのですが ポインタを使っている意味が余りないので ポインタを使うよりよいプログラムを教えてください. (アドバイスでもかまいません.)

  • C言語の、ポインターの問題を教えて下さい

    C言語の、ポインターを使って大文字と小文字を入れ替えるプログラムを教えて下さい。 作ったのですが、うまくいかず困っています。 分かる方、訂正してください。 よろしくお願いいたします。 #include<stdio.h> void reverse(char *str) { int i; for(i=0;str[i]!='\0';i++) { if(str[i]>=0x61) {str[i]-0x20;} if(0x40<str[i]<0x5B) {str[i]+0x20;} } return(str); } int main(void) { int num; char *str="AddsssEEEEwwwJojoHoih"; printf("Before reverse %s \n",str) str=reverse(str); printf("After reverse %s \n",str); return 0; }

  • 至急!教えてください。

    #include <stdio.h> #include <windows.h> #define COUNT (3) struct Seiseki{ char name[20]; int score1; int score2; int score3; int score4; int score5; int average; }; int getValue(char str[], char temp[], int n){ memset(temp, 0, 19); while(*(str+n) == ' '){ n++; } int i = 0; while(*(str+n) != ' ' && *(str+n) != 0){ temp[i] = *(str+n); i++; n++; } return n; } void getAverage(Seiseki *seiseki){ int total = seiseki->score1 + seiseki->score2 + seiseki->score3 + seiseki->score4 + seiseki->score5; seiseki->average = total / 5; } void getSeiseki(Seiseki seiseki[]){ char temp[20]; char str[256]; for(int i = 0; i < COUNT; i++){ printf_s("%d 人目の点数と名前 > ", i+1); memset(str, 0, 255); gets(str); int n = 0; n = getValue(str, temp, n); strcpy(seiseki[i].name, temp); n = getValue(str, temp, n); seiseki[i].score1 = atoi(temp); n = getValue(str, temp, n); seiseki[i].score2 = atoi(temp); n = getValue(str, temp, n); seiseki[i].score3 = atoi(temp); n = getValue(str, temp, n); seiseki[i].score4 = atoi(temp); n = getValue(str, temp, n); seiseki[i].score5 = atoi(temp); getAverage(&seiseki[i]); } } void showSeiseki(Seiseki seiseki[]){ for(int i = 0; i < COUNT; i++){ printf("%d %s %d %d %d %d %d\n", i+1, seiseki[i].name, seiseki[i].score1, seiseki[i].score2, seiseki[i].score3, seiseki[i].score4, seiseki[i].score5, seiseki[i].average); } } void showScoresAverage(Seiseki seiseki[]){ int total1 = 0; int total2 = 0; int total3 = 0; int total4 = 0; int total5 = 0; for(int i = 0; i < COUNT; i++){ total1+=seiseki[i].score1; total2+=seiseki[i].score2; total3+=seiseki[i].score3; total4+=seiseki[i].score4; total5+=seiseki[i].score5; } int ave1 = total1 / COUNT; int ave2 = total2 / COUNT; int ave3 = total3 / COUNT; int ave4 = total4 / COUNT; int ave5 = total5 / COUNT; printf_s("\naverage %d %d %d %d %d\n",ave1, ave2, ave3, ave4, ave5); } void main(){ Seiseki seiseki[COUNT]; printf_s("生徒 %d 名分の成績を入力してください:\n", COUNT); getSeiseki(seiseki); printf_s("\n成績表\n# NAME #1 #2 #3 #4 #5 average\n"); showSeiseki(seiseki); showScoresAverage(seiseki); } 間違っている点がありますか? ありましたらどこに入れるか教えてください。 改良点などありましたらお願いします。

  • 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の行がたぶん間違っていると思うんですが。。。

  • C言語 初心者です。

    今、英単語帳を作っているのですが、以下のソースではできません。 作ろうとしているプログラムは、a bを登録した場合、次がaabと来たら、 a aab bといったようにしたいのですが、できません。教えてください。 #include <stdio.h> #include <string.h> #define NUMBER 50 /*--- 単語帳の構造体*/ typedef struct { char *word; } words; /*--- 文字列strから文字列wordを検索する ---*/ char *str_chr(const char *str, int w) { for ( ; *str; *str++){ if (*str == w){ return ((char *)str); } } return (NULL); /*検索したが該当しないときはNULLを返す*/ } /*--- 単純交換ソート ---*/ void swap(int *x, int *y) { int temp = *x; *x = *y; *y = temp; } /*--- 配列dataの先頭n個の要素を昇順にソート ---*/ void sort(words data[], int n) { int k = n - 1; while (k >= 0){ int i, j; for (i = 1, j = -1; i <= k; i++) if (data[i - 1].word > data[i].word){ j = i - 1; swap(&data[i], &data[j]); } k = j; } } int main(void) { words word[NUMBER][20] = {{0},{0}}; char str[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; char w[128], *p; int count = 0; do{ printf("単語を入力してください。:"); /*単語を入力する*/ scanf("%s", w); p = str_chr(str, w); }while(p == NULL); count++; if(count >= NUMBER){ /*登録件数を調べる*/ printf("件数いっぱいです。\n"); } return (0); sort(word, NUMBER); return (0); }

  • c言語についてです。

    文字の順番を逆さまにするプログラムなのですが実行してenterキーを押しても何もおこりません。原因がわかる方がいたら教えてほしいです。 初歩的な質問ですみません。 使っているパソコンはMacBookProです。 #include<stdio.h> void reverse(char[],char[]); void divide(char[],char[]); int main(void) { char s[100],t[100]; gets(s); reverse(s,t); divide(t,s); printf("%s %s\n",s,t); return 0; } void reverse(char s[],char t[]) { int i=0,j=0; while(s[i]!=0){ i++; } i--; while(i>=0){ t[j]=s[i]; i--; j++; } t[j]=0; return ; } void divide(char t[],char s[]){ int i=0,j=0; while(t[j]!=' '){ i++; } t[i]=0; i++; while(t[i]!=0){ s[j]=t[i]; j++; i++; } s[j]=0; return ; }

  • 加算、減算、乗算、除算について

    // 加算、減算、乗算、除算について // 記号と数値にそれぞれ別の配列に分けました。 // そこから、どうすれば計算ができるのか // 悩んでいます。よろしくお願いします。 #include<iostream> using namespace std; char **tokei(char *str1,char *str2,int *count,char *kigouX); int main() { int count; int *num; char **www; char kigo[12]; char str1[30],str2[]="+-*/"; strcpy(str1,"123+45-6*789/"); www=tokei(str1,str2,&count,kigo); num=new int[count]; for(int n=0;n<count;n++) { num[n]=atoi(www[n]); } // 数値に変換num[]、記号を順番に抽出kigo[] -->OK // 記号に沿って、数値を演算すればよい。 // ここがやり方(理屈)がわからない。 getchar();{}return 0; } char **tokei(char *str1,char *str2,int *count,char *kigouX) { int cnt=0; int m=0; for(int a=0;*(str1+a)!='\0';a++){} for(int b=0;*(str2+b)!='\0';b++){} for(int i=0;i<a;i++) { for(int j=0;j<b;j++) { if(*(str1+i)==*(str2+j)) { *(kigouX+m)=*(str1+i);m++; *(str1+i)='\0'; cnt++; } } } *(kigouX+m)='\0'; char **c; c=new char*[cnt]; *count=cnt; for(int m=0;m<cnt;m++) { c[m]=str1; while(*str1!='\0'){str1++;}str1++; } return c; }

  • 文字列とポインタの問題です。

    #include<stdio.h> int f(char *s); int main(void){ char*str="nasida Institute of Technology"; int i; i=f(str); printf("%s:%d\n",str,i); return 0; } int f(char *s) { int j=0; while(*s!='\0'){ if(*s=='t'){ j++; } s++; } return j; } このプログラムの答えが3になるんですが、if文のとこの動作がよく分からないので、よろしくお願いします。