2015-11-05 57 views
0

需要幫助的長時間潛伏者,我無法通過搜索找到。好吧,我在說謊,我發現了一些東西,但它沒有幫助我。將char數組傳給toupper函數

我想要做的是創建一個帶有字符串的字符串數組,並將它們傳遞給一個函數,該函數將大寫字母字符(它應該只有一個),然後用大寫字母再次顯示字符數組。

我不能得到這個工作。我通過搜索欄找到和它說我應該能夠通過

*d = toupper(*d); 

傳遞一個指向一個字符數組和大寫,但它只是不工作。任何人都可以談談這個問題嗎?謝謝!

它編譯通過經由命令提示用gcc和它給是一個「總線10的錯誤」和Xcode中我得到這樣的:「線程1:EXC_BAD_ACCESS(代碼= 2,地址= memorylocation)」

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

int main() { 

void print_data(char *info[]); 
void convert_data(char *info[]); 
char *data[] = { "000a", "000b", "000c", "000d", "000e" }; 

print_data(data); 
printf("\n"); 
convert_data(data); 
print_data(data); 

return 0; 

} 

void print_data(char *info[]) { 
    int n; 
    for (n=0; n < 5; n++) { 
     char *p = info[n]; 
     while (*p != '\0') { 
      printf("%c", *(p++)); 
     } 
     printf("\n"); 
    } 
} 

void convert_data(char *info[]) { 
    int n; 
    for (n=0; n<5; n++) { 
     char *d = info[n]; 
     while (*d != '\0') { // I THINK THIS IS THE PROBLEM 
      *d = toupper(*d); // RIGHT HERE TOO 
      d++; 
     } 
    } 
} 
+0

首先,你還沒有充分的描述你的程序的電流(不正確的)行爲。它究竟在做什麼?但對於初學者來說:while(* d!='\ 0')',這是一個infinete循環,因爲'd'在循環內部沒有任何變化。 – kaylum

+0

我添加了d ++,但在它出現之前它給了我一個錯誤。 – rAFTA

+0

「給我一個錯誤」..這是?如果確實有這個問題,那麼用'd ++'更新你的代碼,否則我們該如何關注你的實際問題? – kaylum

回答

0
char *data[] = { "000a", "000b", "000c", "000d", "000e" }; 

這聲明瞭一個數組char指針並初始化每個數組項以指向一個常量字符串。調用toupper來修改任何這些字符串時,不能修改常量字符串,因此會導致內存訪問錯誤。

有很多方法可以解決這個問題。但他們都歸結爲爲字符串數據分配內存。快速的方法(但不一定是最好的)是更改data聲明,以便每個數組條目是一個數組char。像這樣:

char data[][5] = { "000a", "000b", "000c", "000d", "000e" }; 

然後還需要更改採取data的功能是正確的類型:

void print_data(char info[][5]); 
void convert_data(char info[][5]);