所以我有一个函数,它将一个Pointer指向一个'Strings'数组(我理解字符串只是内存块后跟'\ 0')。由于字符串已经是指向字符串第一个字节的指针,因此我的指针实际上是一个** doublePointer。然而,我对Ying Yang进行了分离,老实说,我不知道在低级视图中发生了什么。这是我的下面的代码,它的功能是读取字符并大写第一个单词的第一个字母(在字符串中)和一段时间之后。
void autocaps(char ** words)
{
/* Add code here */
//Period Boolean
bool next=false;
//First Word Boolean
bool fcap=true;
//Counter Variable
int i=0;
int j=0;
//Second Pointer
char** wordx = words;
//LowerCase Bomb & Period Flagging
while(wordx[i][j]!='\0'){
while(wordx[i][j]!='\0'){
//A-Z Filter
if((wordx[i][j]>='A')&&(wordx[i][j]<='Z')){
wordx[i][j]+=32;
}
if(wordx[i][j]=='.'){
next=true;
}
j++;
}
i++;
}
i=0;
j=0;
//Cap First Word & Cap Post Period
while(words[i]!='\0'){
while(words[i][j]!='\0'){
//a-z Filter
if((words[i][j]>=97)&&(words[i][j]<=122)){
if(fcap){
words[i][j]-=32;
fcap=false;
}
if(next){
words[i][j]-=32;
}
}
j++;
}
i++;
}
return;
}
当我打印通过参数传递的原始指针时,我是段错误的。如果有人可以向我解释这个问题的低级概念,因为我很困惑,我在各地投掷三星和四星,我甚至不知道它是否让我更接近或更远地调试我的代码。
谢谢!!
答案 0 :(得分:0)
你说的是'字符串数组',但是基于你的代码和你的意图(大写第一个字符和句点之后)我将假设你打算在你传递给函数的单个字符串上工作。
字符串只是一个字符数组,后跟一个0值。你想要做的是遍历字符数组。从字符指针获取要取消引用指针的字符。这就是为什么你在我们实际检查字符串中的字符时到处看到'* words'的原因。
双重,三重和四重指针让你离解决方案更远。
这是一个重新设计的样本:
void autocaps(char* words)
{
bool fcap=true; /* true so first letter is made cap */
while (*words != '\0')
{
if (fcap)
{
/* capitalize */
if ((*words >= 'a') && (*words <= 'z'))
{
*words -= 32;
}
fcap = false;
}
else
{
/* not cap */
if ((*words >= 'A') && (*words <= 'Z'))
{
*words += 32;
}
}
/* period - cap next letter */
if (*words == '.')
{
fcap = true;
}
/* step to next character in array */
words++;
}
return;
}
答案 1 :(得分:0)
我正在将字符串数组初始化为字符串,例如:
char *words[2] = {"hello", "world"};
然后在第一次到达时会出现分段错误
**words+=32;
因为您正在尝试修改只读位置。
你应该像这样初始化字符串:
char word1[] = {'h', 'e', 'l', 'l', 'o', 0};
char word2[] = {'w', 'o', 'r', 'l', 'd', 0};
char *words[] = {word1, word2};
另一个问题确实是
*words++;
您不希望这样做有两个原因:
现在,如果你想进入下一个角色,你不想这样做:
(*words)++
因为现在你实际上是在更改单词数组中的指针,而你不想这样做。