2015-11-05 58 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]);