如何在C语言中创建一个字符串类型的变量

13

问题

如何在C中声明字符串变量?

背景

在我学习 的基础知识时,我试图将我的最早的 程序“Bob”移植到 C。在该程序中,脚本会要求用户输入一些关于自己的信息,然后输出相应的回答。几乎所有的变量都使用 raw_input 来获取其信息 - 这些变量都是字符串。但是,我找不到在C语言中声明变量的方法。

代码

到目前为止,我尝试声明类型为 charint 的变量。以下是代码,请随意更改类型。

int main(int argc, const char * argv[])
{

    int name;
    printf("What is your name?");
    scanf("%s",&name);
    printf("Your name is %s", name );

    return 0;
}

错误消息

当我运行这段代码时,Xcode 返回一些奇怪的东西。全局视野的这个部分被突出显示。

0x7fff96d2b4f0:  pcmpeqb(%rdi), %xmm0

最后,这个Yahoo答案说我必须使用一个叫做字符数组的东西。那是5年前发布的,所以我认为现在有更好的方法。

编辑

我正在按照C编程教程做。


1
为什么要打上[tag:python]这个标签? - millimoose
1
一个字符串是以0结尾的字符数组。 - Daniel Fischer
2
你为什么要使用整数来表示“name”? - mgilson
3
这是一道C语言教程级别的问题,建议按照这个建议进行。 (一个迂腐但无用的答案是:C语言没有字符串类型,只有字符数组和期望它们以空字符结尾的字符串操作函数。) - millimoose
1
自从Yahoo的答案发布以来,没有更好的方法了。那里的答案仍然是最好的。 - QuentinUK
显示剩余5条评论
8个回答

10
char name[60];
scanf("%s", name);

编辑:限制输入长度为59个字符(加上终止符0):

char name[60];
scanf("%59s", name);

3
你的意思是 scanf("%59s", name) 吧? - cnicutar
1
既然你正在处理一个自称初学者的人,那么从一开始就教授可疑的习惯是没有意义的。 - cnicutar
@ValeriAtamaniouk 那如果我的名字超过60个字符会发生什么? - xxmbabanexx
1
@xxmbabanexx 未定义行为。很可能输入会覆盖整个堆栈。 - cnicutar
另外,在 Xcode 中 scanf 以黄色显示。它会显示“格式指定了类型 'char ',但参数的类型为 'char()[60]'”。 - xxmbabanexx
显示剩余2条评论

3

你输入的int不是一个字符串,字符串应该像这样 "char myString[20]"。而不是像 "int name" 这样的整数,也不是字符或字符串。以下是你需要的代码:

         int main(int argc, const char * argv[])
{

char name[9999];
printf("What is your name?\n");
scanf("%s", name);
system("cls");
printf("Your name is %s", name);

return 0;
}

2
在C语言中,你不能像Java和其他语言一样直接声明字符串变量。你需要使用字符数组或指针来声明字符串。
char a[50];
printf("Enter your string");
gets(a);

或者

char *a;
printf("Enter your string here");
gets(a);

或者

char a[60];
scanf("%59s",a);

1
最好不要使用gets,像我在答案中所做的那样使用fgets。为什么?我曾经在使用gets时遇到了几个问题,这是一个更复杂的问题。 - Mitro

1

在Xcode上测试过

您可以这样做:

int main(int argc, const char * argv[])
{

    int i;
    char name[60]; //array, every cell contains a character

    //But here initialize your array

    printf("What is your name?\n");
    fgets(name, sizeof(name), stdin);
    printf("Your name is %s", name );

    return 0;
}

初始化数组是很好的避免错误的方法

for(i=0;i<60;i++){
      name[i]='\0'; //null
}

相反,int 用于整数(1、2、3等);而对于浮点数,您需要使用 float


fgets和相关参数是什么意思? - xxmbabanexx
'fgets'函数会将每个字符逐个放入数组名称的长度中,并在最后一个使用的单元格后面放置'\0',表示空值。stdin函数可以清除输入流。 - Mitro

0

这很容易!

只需将此行代码放在您的 main() 函数的顶部即可。

typedef string char*;

这样可以让你像在C语言中创建整数或字符变量一样创建字符串变量。之后,你的程序应该看起来像这样:

#include <stdio.h>

typedef char* string;

int main(void) {
    string a = "Hello";
    printf("%s\n", a);  // %s format specifier for String
    return 0;
}

如需进行实时演示,请访问this REPL.it


当你说“只需放置这行代码…”时,你将类型声明输入反了。然后,在下面的代码块中,你才是正确的。 - Jeff McMahan

0

C语言没有字符串变量类型。字符串可以作为字符数组(char变量类型)存储。我会给出最基本的例子:

int main()
{
   char name[] = "Hello World!";
   printf("%s",name);
   return(0);
}

-1
通常我们在scanf中使用"&",但是在这里不应该在变量"name"之前使用它。因为"name"是一个字符数组。当一个字符数组的名称在没有"[]"的情况下使用时,它表示数组的地址。

-2
将“int name;”替换为“char name[60];”。
#include <stdio.h>
int main()
{
  char name[648];
  printf("What is your name?");

  scanf("%s", name);
  printf("Your name is %s", name );

  return 0;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接