我对C很陌生,在创建以下功能时遇到了障碍。我想使用这个函数来为一个静态字符数组(char string []创建单词大写的第一个字母。它看起来不错,但我得到一些语法错误,这可能是非常基本的。 编译器错误:
错误:从
const char' to
const char *'转换无效 初始化`size_t strlen(const char *)'的参数1 分配只读位置
void Cap(char string[]){
int i;
int x = strlen(string);
for (i=1;i<x;i++){
if (isalpha(string[i]) && string[i-1] == ' '){
// only first letters of a word.
string[i]= toupper(string[i]);
}if (isalpha(string[0]))
{
string[0]=toupper(string[0]);
}
}
}
答案 0 :(得分:1)
您可能希望运行strlen(string)
- 因为strlen(string[i])
正在尝试获取单个字符的长度。
答案 1 :(得分:1)
我还会指出你的牙套不匹配......
if (isalpha(string[i])){
string[i]= toupper(string[i]);
删除if行上的大括号或在分配语句后放置一个大括号。
答案 2 :(得分:0)
你缺少if语句的结束花括号。这可能只是问题中的拼写错误,但为了以防提及它。
您的功能被宣布无效。这意味着它什么都不返回。任何return语句都应该在单词后面没有任何内容,因为函数没有返回任何内容,并且在很多情况下你根本就没有return语句。
然而,最大的问题是这不是一个字符串数组。它是一个字符数组,只是一个字符串。 char* string
和char string[]
两者(可能)都是指一个字符数组,它构成一个字符串。您需要使用另一级别的间接来引用一个字符数组数组:char** strings
,char* strings[]
或char strings[][]
。最后一个表单需要您指定所有字符串的长度,因此您通常只使用前两个字符串。
答案 3 :(得分:0)
这里的问题是你传入一个字符串,而不是一个字符串数组。
基本上在C中,字符串是一个字符数组,因此字符串数组是一个二维数组,如下所示:
const char* strings[];
代码还有一些其他问题。在使用之前,您尚未初始化i。
答案 4 :(得分:0)
我拿了你的代码并试图编译它。好吧,下次看到可编译的代码会很高兴。这是一个有评论的。
#include <stdio.h> // Now I am able to use printf.
#include <string.h> // I was not able to use strlen without this...
void Cap(char string[]){
int i;
int x = strlen(string); // You want to get the length of the whole string.
for (i=1;i<x;i++){
if (isalpha(string[i]) && string[i-1] == ' '){
// only first letters of a word.
string[i]= toupper(string[i]);
}
}
}
main(){
char string[] = "text with lowercase words.";
Cap(string);
printf("%s",string);
};
该文字的第一个字仍然是小写字母。这是你的任务。
答案 5 :(得分:0)
替代方法:(写一个函数)
1) (可选)为调用函数的结果分配相同长度的新缓冲区的内存。
2) 在功能中 - 将新字符串的第一个字符串设置为原始字符串的大写版本
3) 浏览字符串,搜索空格
4) 对于每个空格,将新字符串的下一个字符串设置为原始字符串中字符的大写字母
5) 循环4)直到检测到NULL为止
6) 在调用程序中释放任何已分配的内存。
代码示例:
void capitalize(char *str, char *new)
{
int i=0;
new[i] = toupper(str[0]);//first char to upper case
i++;//increment after every look
while(str[i] != '\0')
{
if(isspace(str[i]))
{
new[i] = str[i];
new[i+1] = toupper(str[i+1]);//set char after space to upper case
i+=2;//look twice, increment twice
}
else
{
new[i] = str[i];//for no-space-found, just copy char to new string
i++;//increment after every look
}
}
}
答案 6 :(得分:0)
这应该可以正常工作。
#include <stdio.h>
#include <string.h>
capital(char s[])
{
int i;
for(i=0; i<strlen(s); i++)
{
if (i==0||s[i-1]==' '&&s[i]>='a'&&s[i]<='z')
s[i]=toupper(s[i]);
}
puts(s);
}
main()
{
char s[100];
printf("Enter a line: ");
gets(s);
capital(s);
}
答案 7 :(得分:0)
我根据Stefan Bollmann回复进行了更新:
#include <string.h>
#include <stdio.h>
char* uc_words(char string[])
{
int i;
int x = strlen(string);
int counter = 0;
for (i = 0; i < x; i++)
{
// If found a white-space reset counter
if (isspace(string[i]))
counter = 0;
// Check if first character in word
if (isalpha(string[i]) && !isspace(string[i]) && counter == 0)
{
string[i]= toupper(string[i]);
counter = 1;
}
}
return string;
}
int main()
{
char string[] = "hello world";
printf("%s\n", uc_words(string));
return 0;
}