在C中操纵字符串

时间:2013-06-17 16:41:12

标签: c string character ascii digit

我必须保存字符串中有多少个字母,数字,空格和行:

char string[2048];
...
string = "aaa 111\nsas 23 d\nds";
for(i = 0; i < strlen(string); i++){
    if (isdigit(string[i]) != 0){
        numbers++;
    } else if (isascii(string[i]) != 0){
        letters++;
    } ...
}

它给我带来了许多错误,“从类型'char *'”中分配类型'char [2048]'时出现不兼容的类型以及其他错误

该代码有什么问题?

谢谢你, 洛伦佐

4 个答案:

答案 0 :(得分:2)

尝试,

char string[2048];

strcpy(string,"aaa 111\nsas 23 d\nds");

char string[2048] = "aaa 111\nsas 23 d\nds";

而不是

char string[2048];

string = "aaa 111\nsas 23 d\nds";

答案 1 :(得分:1)

短版

您将字符串声明为char:的大小为2048的数组:

char string[2048];

这一行导致了麻烦,因为你指定了一个char *,它是一个指针:

string = "aaa 111\nsas 23 d\nds";

尝试以下命令,它将遍历char *并复制元素,直到到达字符串的末尾:

strcpy(string, "aaa 111\nsas 23 d\nds");

如果您只想为此char []提供初始值,请使用:

char string[2048] = "aaa 111\nsas 23 d\nds";

长版

在这种情况下你所做的是好的,但在实践中,使用固定大小的字符数组会很危险。如果你试图复制超过2048个字符的字符串,那么你将在为这个变量分配的空间之后写字。

你不能只分配的原因是它们是字符数组,它不是在C中真正定义的操作,char [2048]只是长度为2048*sizeof(char)的空间上的一种指针。 strcpy()将迭代第二个参数并复制字符,直到找到标记字符串结尾的0

您可能需要检查strncpy(),因为如果字符串大于缓冲区,则更安全。来自man page

  

stpncpy()和strncpy()函数最多复制n个字符   s2进入s1。如果s2小于n个字符长,则s1的余数   用'\ 0'字符填充。否则,s1不会被终止。

答案 2 :(得分:0)

char string[2048] = "aaa 111\nsas 23 d\nds";
n = strlen(string);
for(i = 0; i < n; i++){
    if (isdigit(string[i]) != 0){
        numbers++;
    } else if (isascii(string[i]) != 0){
        letters++;
    } ...
}

答案 3 :(得分:0)

使用strcpy而非分配string = "aaa 111\nsas 23 d\nds";或将字符串数组初始化为char string[2048] = "aaa 111\nsas 23 d\nds";