输出汉字的时候VS会报错。

求问,输出汉字的时候VS会报错。该怎么改代码呀,是什么原因导致的,完全摸不着头绪!
题目是输入职工姓名和工号,按工号由小到大排序。

#include <stdio.h>
int main()
{
    int str[100] = { 0 };\\存储姓名
    int strz[100] = { 0 };\\冒泡法是存储姓名的
    int number[100] = { 0 };\\存储工号
    int i, j, k;
    printf("请输入职工姓名与职工号,以空格分隔:");
    for (i = 0; i < 10; i++) {\\读入姓名工号
        scanf("%s %d", &str[i], &number[i]);
    }
    for (i = 0; i < 10; i++) {\\冒泡法
        for (j = 0; j < 9 - i; j++) {
            if (number[j] > number[j + 1]) {
                k = number[j + 1];\\工号的
                strz[0] = str[j + 1];\\姓名的
                number[j + 1] = number[j];
                str[j + 1] = str[j];
                number[j] = k;
                str[j] = strz[0];
            }
        }
    }
    printf("职工按照职工号排序为:\n");
    for (i = 0; i < 10; i++) {
        printf("%s\n", str[i]);\\输出不了,会报错
    }

}

img

修改如下,改动处见注释,供参考:

#include <stdio.h>
#include <string.h>   // 修改
#define N 10           // 修改 
int main()
{
    char str[N][100] = { 0 }; //存储姓名  int str[100] = { 0 };  修改
    char strz[100] = { 0 };   //存储姓名  int  strz[100] = { 0 }; 修改
    int  number[N] = { 0 }; //存储工号
    int i, j, k;
    printf("请输入职工姓名与职工号,以空格分隔:");
    for (i = 0; i < N; i++) {
        //读入姓名工号
        scanf("%s %d", str[i], &number[i]);   // 修改
        //scanf("%s %d", &str[i], &number[i]);
    }
    for (i = 0; i < N - 1; i++) {  //for (i = 0; i < 10; i++) 修改 
         //冒泡法
        for (j = 0; j < N - 1 - i; j++) {    // 修改 
            if (number[j] > number[j + 1]) {

                k = number[j + 1];   //工号的    
                number[j + 1] = number[j];
                number[j] = k;
                                             // 修改
                strcpy(strz, str[j + 1]);    //strz[0] = str[j + 1]; //姓名的
                strcpy(str[j + 1], str[j]);  //str[j + 1] = str[j];
                strcpy(str[j], strz);       //str[j] = strz[0];
            }
        }
    }
    printf("职工按照职工号排序为:\n");
    for (i = 0; i < N; i++) {      // 修改
        printf("%d %s\n", number[i], str[i]); // 修改
    }
    return 0;
}

把第4行

int str[100] = { 0 };\\存储姓名
改为
char str[100] = { 0 };\\存储姓名

因为存储多个姓名字符串的str是一维int数组,所以运行时会出错;

将第四行的 int str[100] = { 0 },改为二维字符数组, 即char str[10][100]即可,因为是要存储十个姓名字符串。

修改如下:

参考链接:


C语言存放多个字符串_c语言存储多个字符串_樊庆威的博客-CSDN博客 存放一个字符串1.字符指针:char *str="hello";2.字符数组:char str[ ]="hello";存放多个字符串1.二维字符串数组:char name[4][10]={"Hello","Word","I","am"};例如输入10个字符串,每个字符串最大长度不超过100,读入字符串如下:#include<stdio.h&_c语言存储多个字符串 https://blog.csdn.net/qq_41765712/article/details/81740350


#include <stdio.h>

// 复制字符串的简易函数 
// 将src里的字符串复制到dest 
char * copyStr(char * dest, char * src){
    
    int i =0;
    if (dest==NULL || src==NULL){
        return NULL;
    }
    
    while(src[i]!='\0'){
        dest[i] = src[i];
        i++;
    }
    dest[i]='\0'; 
    
    return dest;
}

int main()
{
    // https://blog.csdn.net/qq_41765712/article/details/81740350
    char str[10][100] = { 0 };//存储十个姓名字符串的二维字符数组 
    char temp[100];
    int strz[100] = { 0 };//冒泡法是存储姓名的
    int number[100] = { 0 };//存储工号
    int i, j, k;
    printf("请输入职工姓名与职工号,以空格分隔:\n");
    for (i = 0; i < 10; i++) {//读入姓名工号
    // https://zhuanlan.zhihu.com/p/392136002
        scanf("%s %d", &str[i], &number[i]);
    }
    for (i = 0; i < 10; i++) {//冒泡法
        for (j = 0; j < 9 - i; j++) {
            if (number[j] > number[j + 1]) {
         
                copyStr(temp,str[j]);
                copyStr(str[j],str[j+1]);
                copyStr(str[j+1],temp);
                k=number[j];
                number[j]=number[j+1];
                number[j+1]=k;
               
            }
        }
    }
    printf("职工按照职工号排序为:\n");
    for (i = 0; i < 10; i++) {
        printf("%s\n", str[i]);
    }
 
}

img

这其实是编码问题,Windows的命令行用的是ANIS编码,但编辑器用的是utf8编码,你这需要用Windows自带的记事本打开->另存为->保存编码选择ANIS编码(所有编码里的第一个)点保存之后再编译就过了.

上图

img


代码

#include <stdio.h>
#include <cstring>
int main() {
  char str[100][32] = {0}; // 字符串数组
  int number[100] = {0}; // 工号数组

  int i, j, k;

  printf("请输入职工姓名与职工号,以空格分隔:\n");

  for (i = 0; i < 10; i++) {
    scanf("%s %d", str[i], &number[i]); // 读入字符串和工号
  }
  
  for (i = 0; i < 10; i++) {
    for (j = 0; j < 9 - i; j++) {
      if (number[j] > number[j + 1]) {
        k = number[j + 1];
        char tmp[32]; // 交换字符串用的临时变量
        strcpy(tmp, str[j + 1]); 
        number[j + 1] = number[j];
        strcpy(str[j + 1], str[j]);
        number[j] = k;
        strcpy(str[j], tmp);
      }
    }
  }

  printf("职工按照职工号排序为:\n");

  for (i = 0; i < 10; i++) {
    printf("%s\n", str[i]); // 输出字符串
  }

  return 0;
}

这题定义结构体或许会更简单
而且你有个错误,你可以把第四行改成char类型的,因为名字可不是整形,是字符型的
具体改法如下:

char str[100] = { 0 };//把int改成char

你可以先采纳一下,我尽量用结构体帮你写写看